<?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.
-->

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.maven.its.mng5214</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>dependency</artifactId>

  <name>Maven Integration Test :: MNG-5214 :: Dependency</name>
  <description>A very dull project, which exists only so that its g:a:v is in the reactor.
  </description>

  <build>
    <outputDirectory>classes-main</outputDirectory>
    <testOutputDirectory>classes-test</testOutputDirectory>
  </build>

  <profiles>
  <profile>
    <id>createWsdl</id>
    <build>
      <plugins>
	<plugin>
	  <groupId>org.apache.maven.its.plugins</groupId>
	  <artifactId>maven-it-plugin-artifact</artifactId>
	  <version>2.1-SNAPSHOT</version>
	  <executions>
	    <execution>
	      <id>attach-artifacts</id>
	      <phase>generate-resources</phase>
	      <goals>
		<goal>attach</goal>
	      </goals>
	      <configuration>
		<attachedFile>notmuch.wsdl</attachedFile>
		<artifactType>wsdl</artifactType>
	      </configuration>
	    </execution>
	    <execution>
	      <id>install</id>
	      <phase>generate-resources</phase>
	      <configuration>
		<pomFile>pom.xml</pomFile>
		<!-- borrow the POM as the main artifact -->
		<mainFile>pom.xml</mainFile>
	      </configuration>
	      <goals>
		<goal>set</goal>
		<goal>attach-pom</goal>
		<goal>install</goal>
	      </goals>
	    </execution>
	  </executions>
	</plugin>
      </plugins>
    </build>
  </profile>
  </profiles>
</project>
