<?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.mng4056</groupId>
    <artifactId>parent</artifactId>
    <version>0.1</version>
  </parent>

  <artifactId>producer</artifactId>
  <packaging>jar</packaging>

  <name>Maven Integration Test :: MNG-4056 :: Dependency Producer</name>
  <description>
    Test that attached artifacts can be resolved from the reactor cache even if the dependency declaration
    in the consumer module does not use the proper artifact type but merely specifies the classifier.
  </description>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.its.plugins</groupId>
        <artifactId>maven-it-plugin-artifact</artifactId>
        <version>2.1-SNAPSHOT</version>
        <executions>
          <execution>
            <id>package</id>
            <phase>validate</phase>
            <goals>
              <goal>set</goal>
            </goals>
            <configuration>
              <mainFile>pom.xml</mainFile>
            </configuration>
          </execution>
          <!-- NOTE: It is essential part of this test to attach the artifacts using the dedicated artifact type -->
          <execution>
            <id>package-tests</id>
            <phase>validate</phase>
            <goals>
              <goal>attach</goal>
            </goals>
            <configuration>
              <!-- mimic maven-jar-plugin:2.2:test-jar -->
              <attachedFile>test.jar</attachedFile>
              <artifactType>test-jar</artifactType>
              <artifactClassifier>tests</artifactClassifier>
            </configuration>
          </execution>
          <execution>
            <id>package-sources</id>
            <phase>validate</phase>
            <goals>
              <goal>attach</goal>
            </goals>
            <configuration>
              <!-- mimic maven-source-plugin:2.0.4:jar -->
              <attachedFile>source.jar</attachedFile>
              <artifactType>java-source</artifactType>
              <artifactClassifier>sources</artifactClassifier>
            </configuration>
          </execution>
          <execution>
            <id>package-javadocs</id>
            <phase>validate</phase>
            <goals>
              <goal>attach</goal>
            </goals>
            <configuration>
              <!-- mimic maven-javadoc-plugin:2.5:jar -->
              <attachedFile>javadoc.jar</attachedFile>
              <artifactType>javadoc</artifactType>
              <artifactClassifier>javadoc</artifactClassifier>
            </configuration>
          </execution>
          <execution>
            <id>package-client</id>
            <phase>validate</phase>
            <goals>
              <goal>attach</goal>
            </goals>
            <configuration>
              <!-- mimic maven-ejb-plugin:2.1:ejb -->
              <attachedFile>client.jar</attachedFile>
              <artifactType>ejb-client</artifactType>
              <artifactClassifier>client</artifactClassifier>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
