<?xml version="1.0" encoding="UTF-8"?>
<!--
 ***************************************************************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
 * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
 * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
 * with the License.  You may obtain a copy of the License at                                                              *
 *                                                                                                                         *
 *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
 *                                                                                                                         *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 * specific language governing permissions and limitations under the License.                                              *
 ***************************************************************************************************************************
-->
<!--
	This project is meant to be used as a starting point for developers to use in creating their own REST microservices.
	It creates a parent REST interface on port 10000 with a single child hello-world resource.
	This POM is likewise meant to be used as a starting point for developers. It creates an uber-jar
	to run the microserice from the command line. Copy the jar as well as the .cfg file and start it
	with java -jar juneau-microservice-template-1.0.0.jar microservice.cfg
	The group/artifact/version information is meant to be overwritten by developers to match their own needs.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	
	<parent>
		<groupId>org.apache.juneau</groupId>
		<artifactId>juneau-microservice</artifactId>
		<version>9.0.0</version>
	</parent>

	<artifactId>juneau-my-springboot-microservice</artifactId>
	<name>juneau/microservice/my-springboot-microservice</name>
	<description>Apache Juneau Spring Boot Microservice Template</description>
	
	<properties>
		<juneau.version>9.0.0</juneau.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	
	<dependencies>
		<dependency>
			<groupId>org.apache.juneau</groupId>
			<artifactId>juneau-rest-server-springboot</artifactId>
			<version>${juneau.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.juneau</groupId>
			<artifactId>juneau-microservice-core</artifactId>
			<version>${juneau.version}</version>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<configuration>
					<!-- Needed to prevent mvn release:prepare from blowing up. -->
					<skip>true</skip>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<executions>
					<execution>
						<id>juneau-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
						<configuration>
							<finalName>my-springboot-microservice-${project.version}</finalName>
							<descriptors>
								<descriptor>src/assembly/bin.xml</descriptor>
							</descriptors>
							<escapeString>\</escapeString>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
