View Javadoc

1   package org.apache.maven.plugins.site;
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 java.io.File;
23  import java.io.IOException;
24  
25  import org.apache.maven.archiver.MavenArchiveConfiguration;
26  import org.apache.maven.archiver.MavenArchiver;
27  import org.apache.maven.artifact.DependencyResolutionRequiredException;
28  import org.apache.maven.plugin.MojoExecutionException;
29  import org.apache.maven.plugin.MojoFailureException;
30  import org.apache.maven.plugins.annotations.Component;
31  import org.apache.maven.plugins.annotations.LifecyclePhase;
32  import org.apache.maven.plugins.annotations.Mojo;
33  import org.apache.maven.plugins.annotations.Parameter;
34  import org.apache.maven.project.MavenProjectHelper;
35  
36  import org.codehaus.plexus.archiver.Archiver;
37  import org.codehaus.plexus.archiver.ArchiverException;
38  import org.codehaus.plexus.archiver.jar.JarArchiver;
39  import org.codehaus.plexus.archiver.jar.ManifestException;
40  
41  /**
42   * Bundles the site output into a JAR so that it can be deployed to a repository.
43   *
44   * @author <a href="mailto:mbeerman@yahoo.com">Matthew Beermann</a>
45   * @version $Id: SiteJarMojo.html 861484 2013-05-09 23:10:16Z hboutemy $
46   * @since 2.0-beta-6
47   */
48  @Mojo( name = "jar", defaultPhase = LifecyclePhase.PACKAGE, requiresReports = true )
49  public class SiteJarMojo
50      extends SiteMojo
51  {
52      private static final String[] DEFAULT_ARCHIVE_EXCLUDES = new String[]{ };
53  
54      private static final String[] DEFAULT_ARCHIVE_INCLUDES = new String[]{ "**/**" };
55  
56      /**
57       * Specifies the directory where the generated jar file will be put.
58       */
59      @Parameter( property = "project.build.directory", required = true )
60      private String jarOutputDirectory;
61  
62      /**
63       * Specifies the filename that will be used for the generated jar file.
64       * Please note that "-site" will be appended to the file name.
65       */
66      @Parameter( property = "project.build.finalName", required = true )
67      private String finalName;
68  
69      /**
70       * Used for attaching the artifact in the project.
71       */
72      @Component
73      private MavenProjectHelper projectHelper;
74  
75      /**
76       * Specifies whether to attach the generated artifact to the project.
77       */
78      @Parameter( property = "site.attach", defaultValue = "true" )
79      private boolean attach;
80  
81      /**
82       * The Jar archiver.
83       *
84       * @since 3.1
85       */
86      @Component( role = Archiver.class, hint = "jar" )
87      private JarArchiver jarArchiver;
88  
89      /**
90       * The archive configuration to use.
91       * See <a href="http://maven.apache.org/shared/maven-archiver/index.html">Maven Archiver Reference</a>.
92       *
93       * @since 3.1
94       */
95      @Parameter
96      private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
97  
98      /**
99       * List of files to include. Specified as file set patterns which are relative to the input directory whose contents
100      * is being packaged into the JAR.
101      *
102      * @since 3.1
103      */
104     @Parameter
105     private String[] archiveIncludes;
106 
107     /**
108      * List of files to exclude. Specified as file set patterns which are relative to the input directory whose contents
109      * is being packaged into the JAR.
110      *
111      * @since 3.1
112      */
113     @Parameter
114     private String[] archiveExcludes;
115 
116     /**
117      * @see org.apache.maven.plugin.Mojo#execute()
118      */
119     public void execute()
120         throws MojoExecutionException, MojoFailureException
121     {
122         if ( !outputDirectory.exists() )
123         {
124             super.execute();
125         }
126 
127         try
128         {
129             File outputFile = createArchive( outputDirectory,
130                                              finalName + "-" + getClassifier() + "." + getArtifactType() );
131 
132             if ( attach )
133             {
134                 projectHelper.attachArtifact( project, getArtifactType(), getClassifier(), outputFile );
135             }
136             else
137             {
138                 getLog().info( "NOT adding site jar to the list of attached artifacts." );
139             }
140         }
141         catch ( ArchiverException e )
142         {
143             throw new MojoExecutionException( "Error while creating archive.", e );
144         }
145         catch ( IOException e )
146         {
147             throw new MojoExecutionException( "Error while creating archive.", e );
148         }
149         catch ( ManifestException e )
150         {
151             throw new MojoExecutionException( "Error while creating archive.", e );
152         }
153         catch ( DependencyResolutionRequiredException e )
154         {
155             throw new MojoExecutionException( "Error while creating archive.", e );
156         }
157     }
158 
159     protected String getArtifactType()
160     {
161         return "jar";
162     }
163 
164     protected String getClassifier()
165     {
166         return "site";
167     }
168 
169     /**
170      * Method that creates the jar file.
171      *
172      * @param siteDirectory the directory where the site files are located
173      * @param jarFilename   the filename of the created jar file
174      * @return a File object that contains the created jar file
175      * @throws ArchiverException
176      * @throws IOException
177      * @throws ManifestException
178      * @throws DependencyResolutionRequiredException
179      */
180     private File createArchive( File siteDirectory, String jarFilename )
181         throws ArchiverException, IOException, ManifestException, DependencyResolutionRequiredException
182     {
183         File siteJar = new File( jarOutputDirectory, jarFilename );
184 
185         MavenArchiver archiver = new MavenArchiver();
186 
187         archiver.setArchiver( this.jarArchiver );
188 
189         archiver.setOutputFile( siteJar );
190 
191         if ( !siteDirectory.isDirectory() )
192         {
193             getLog().warn( "JAR will be empty - no content was marked for inclusion !" );
194         }
195         else
196         {
197             archiver.getArchiver().addDirectory( siteDirectory, getArchiveIncludes(), getArchiveExcludes() );
198         }
199 
200         archiver.createArchive( project, archive );
201 
202         return siteJar;
203     }
204 
205     private String[] getArchiveIncludes()
206     {
207         if ( this.archiveIncludes != null && this.archiveIncludes.length > 0 )
208         {
209             return this.archiveIncludes;
210         }
211 
212         return DEFAULT_ARCHIVE_INCLUDES;
213     }
214 
215     private String[] getArchiveExcludes()
216     {
217         if ( this.archiveExcludes != null && this.archiveExcludes.length > 0 )
218         {
219             return this.archiveExcludes;
220         }
221         return DEFAULT_ARCHIVE_EXCLUDES;
222     }
223 }