View Javadoc
1   package org.apache.maven.plugin.coreit;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.artifact.DependencyResolutionRequiredException;
23  import org.apache.maven.plugin.MojoExecutionException;
24  import org.apache.maven.project.MavenProject;
25  
26  import java.util.List;
27  
28  /**
29   * Combines dependency resolution with aggregation. The path parameters of this mojo support the token
30   * <code>&#64;artifactId&#64;</code> to dynamically adjust the output file for each project in the reactor whose
31   * dependencies are dumped.
32   *
33   * @author Benjamin Bentmann
34   *
35   * @goal aggregate-test
36   * @requiresDependencyResolution test
37   * @aggregator true
38   */
39  public class AggregateTestMojo
40      extends AbstractDependencyMojo
41  {
42  
43      /**
44       * The path to the output file for the project artifacts, relative to the project base directory. Each line of this
45       * UTF-8 encoded file specifies an artifact identifier. If not specified, the artifact list will not be written to
46       * disk. Unlike the test artifacts, the collection of project artifacts additionally contains those artifacts that
47       * do not contribute to the class path.
48       *
49       * @parameter property="depres.projectArtifacts"
50       */
51      private String projectArtifacts;
52  
53      /**
54       * The path to the output file for the test class path, relative to the project base directory. Each line of
55       * this UTF-8 encoded file specifies the absolute path to a class path element. If not specified, the class path
56       * will not be written to disk.
57       *
58       * @parameter property="depres.testClassPath"
59       */
60      private String testClassPath;
61  
62      /**
63       * The path to the properties file for the checksums of the test class path elements, relative to the project base
64       * directory. The (trimmed) path to a JAR is used as the property key, the property value is the SHA-1 hash of the
65       * JAR. If not specified, the class path checksums will not be calculated.
66       *
67       * @parameter property="depres.testClassPathChecksums"
68       */
69      private String testClassPathChecksums;
70  
71      /**
72       * The Maven projects in the reactor.
73       *
74       * @parameter default-value="${reactorProjects}"
75       * @readonly
76       */
77      private List reactorProjects;
78  
79      /**
80       * Runs this mojo.
81       *
82       * @throws MojoExecutionException If the output file could not be created or any dependency could not be resolved.
83       */
84      public void execute()
85          throws MojoExecutionException
86      {
87          try
88          {
89              for ( Object reactorProject : reactorProjects )
90              {
91                  MavenProject project = (MavenProject) reactorProject;
92  
93                  writeArtifacts( filter( projectArtifacts, project ), project.getArtifacts() );
94                  writeClassPath( filter( testClassPath, project ), project.getTestClasspathElements() );
95                  writeClassPathChecksums( filter( testClassPathChecksums, project ),
96                                           project.getTestClasspathElements() );
97              }
98          }
99          catch ( DependencyResolutionRequiredException e )
100         {
101             throw new MojoExecutionException( "Failed to resolve dependencies", e );
102         }
103     }
104 
105     private String filter( String filename, MavenProject project )
106     {
107         String result = filename;
108 
109         if ( filename != null )
110         {
111             result = result.replaceAll( "@artifactId@", project.getArtifactId() );
112         }
113 
114         return result;
115     }
116 
117 }