<!--
	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.
-->
<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>
	<!-- This artifact name follows the conventions described http://books.sonatype.com/mvnref-book/reference/writing-plugins-sect-custom-plugin.html
	     where patterns like xxx-maven-plugin and maven-xxx-plugin can be invoked just using xxx if the right settings are in place -->
	<artifactId>jcasgen-maven-plugin</artifactId>
	<packaging>maven-plugin</packaging>
	<name>Apache UIMA Maven: ${project.artifactId}</name>
	<description>A Maven Plugin for using JCasGen to generate Java classes from XML type system descriptions</description>
	<prerequisites>
		<maven>3.0</maven>
	</prerequisites>
	<parent>
		<groupId>org.apache.uima</groupId>
		<artifactId>uimaj-parent</artifactId>
		<version>2.4.2</version>
		<relativePath>../uimaj-parent/pom.xml</relativePath>
	</parent>
	<dependencies>
		<!-- Dependencies on the Maven Plugin API and friends -->
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-plugin-api</artifactId>
			<version>3.0.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-core</artifactId>
			<version>3.0.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven.plugin-tools</groupId>
			<artifactId>maven-plugin-annotations</artifactId>
			<version>3.2</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-tools</artifactId>
			<version>2.4.2</version>
		</dependency>
		<dependency>
			<groupId>org.sonatype.plexus</groupId>
			<artifactId>plexus-build-api</artifactId>
			<version>0.0.7</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven.plugin-testing</groupId>
			<artifactId>maven-plugin-testing-harness</artifactId>
			<version>2.0</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
	  <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-javadoc-plugin</artifactId>
<!--          <version>2.8.1</version> -->
          <configuration>
            <!-- avoiding javadoc warnings caused by Mojo annotations -->
            <tagletArtifacts>
              <tagletArtifact>
                <groupId>org.apache.maven.plugin-tools</groupId>
                <artifactId>maven-plugin-tools-javadoc</artifactId>
                <version>2.9</version>
              </tagletArtifact>
            </tagletArtifacts>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
	
		<plugins>
			<plugin>
				<artifactId>maven-invoker-plugin</artifactId>
				<version>1.7</version>
				<configuration>
					<projectsDirectory>src/it</projectsDirectory>
					<cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
					<pomIncludes>
						<pomInclude>*/pom.xml</pomInclude>
					</pomIncludes>
					<settingsFile>src/it/settings.xml</settingsFile>
					<localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
					<postBuildHookScript>verify.bsh</postBuildHookScript>
					<goals>
						<goal>clean</goal>
						<goal>package</goal>
						<goal>integration-test</goal>
					</goals>
					<!-- change this next line by toggling the "!" character to include / exclude the long-running m2e test
					     It is normally excluded -->
					<invokerTest>classpath,multimodule,simple,!m2e</invokerTest>
				</configuration>
				<executions>
					<execution>
						<id>integration-test</id>
						<goals>
							<goal>install</goal>
							<goal>run</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-plugin-plugin</artifactId>
				<configuration>
          <extractors><extractor>java-annotations</extractor></extractors>
 				</configuration>				
				<executions>
					<execution>
						<id>generated-helpmojo</id>
						<goals>
							<goal>helpmojo</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
