All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.maven.plugin.assembly.mojos.AbstractAssemblyMojo Maven / Gradle / Ivy

Go to download

A Maven plugin to create archives of your project's sources, classes, dependencies etc. from flexible assembly descriptors.

There is a newer version: 3.7.1
Show newest version
package org.apache.maven.plugin.assembly.mojos;

/*
 * 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.
 */

import java.io.File;
import java.util.Collections;
import java.util.List;

import org.apache.maven.archiver.MavenArchiveConfiguration;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
import org.apache.maven.plugin.assembly.InvalidAssemblerConfigurationException;
import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
import org.apache.maven.plugin.assembly.archive.AssemblyArchiver;
import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
import org.apache.maven.plugin.assembly.io.AssemblyReadException;
import org.apache.maven.plugin.assembly.io.AssemblyReader;
import org.apache.maven.plugin.assembly.model.Assembly;
import org.apache.maven.plugin.assembly.utils.AssemblyFormatUtils;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
import org.apache.maven.shared.filtering.MavenFileFilter;
import org.codehaus.plexus.configuration.PlexusConfiguration;

/**
 * @author Brett Porter
 * @author Vincent Siveton
 * @version $Id: AbstractAssemblyMojo.java 1601216 2014-06-08 11:58:09Z khmarbaise $
 * @threadSafe
 */
public abstract class AbstractAssemblyMojo
    extends AbstractMojo
    implements AssemblerConfigurationSource
{
    /**
     * The character encoding scheme to be applied when filtering resources.
     */
    @Parameter( property = "encoding", defaultValue = "${project.build.sourceEncoding}" )
    protected String encoding;

    /**
     * Expressions preceded with this String won't be interpolated.
     * If you use "\" as the escape string then \${foo} will be replaced with ${foo}.
     *
     * @since 2.4
     */
    @Parameter( property = "assembly.escapeString" )
    protected String escapeString;

    /**
     * Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build.
     * This makes the assembly plugin more controllable from profiles.
     */
    @Parameter( property = "assembly.skipAssembly", defaultValue = "false" )
    private boolean skipAssembly;

    /**
     * If this flag is set, everything up to the call to Archiver.createArchive() will be executed.
     */
    @Parameter( property = "assembly.dryRun", defaultValue = "false" )
    private boolean dryRun;

    /**
     * If this flag is set, the ".dir" suffix will be suppressed in the output directory name when using assembly/format
     * == 'dir' and other formats that begin with 'dir'. 
* NOTE: Since 2.2-beta-3, the default-value for this is true, NOT false as it used to be. */ @Parameter( defaultValue = "true" ) private boolean ignoreDirFormatExtensions; /** * Local Maven repository where artifacts are cached during the build process. */ @Parameter( defaultValue = "${localRepository}", required = true, readonly = true ) private ArtifactRepository localRepository; /** */ @Parameter( defaultValue = "${project.remoteArtifactRepositories}", required = true, readonly = true ) private List remoteRepositories; /** * Contains the full list of projects in the reactor. */ @Parameter( defaultValue = "${reactorProjects}", required = true, readonly = true ) private List reactorProjects; /** * The output directory of the assembled distribution file. */ @Parameter( defaultValue = "${project.build.directory}", required = true ) private File outputDirectory; /** * The filename of the assembled distribution file. */ @Parameter( defaultValue = "${project.build.finalName}", required = true ) private String finalName; /** * Directory to unpack JARs into if needed */ @Parameter( defaultValue = "${project.build.directory}/assembly/work", required = true ) private File workDirectory; /** * Specifies the formats of the assembly. * Multiple formats can be supplied and the Assembly Plugin will generate an archive for each desired formats. * When deploying your project, all file formats specified will also be deployed. A format is specified by supplying one of the following * values in a <format> subelement: *
    *
  • dir - Creates a directory
  • *
  • zip - Creates a ZIP file format
  • *
  • tar - Creates a TAR format
  • *
  • tar.gz - Creates a gzip'd TAR format
  • *
  • tar.bz2 - Creates a bzip'd TAR format
  • *
*/ @Parameter private List formats; /** * This is the artifact classifier to be used for the resultant assembly artifact. Normally, you would use the * assembly-id instead of specifying this here. * * @deprecated Please use the Assembly's id for classifier instead */ @Deprecated @Parameter( property = "classifier" ) private String classifier; /** * A list of descriptor files to generate from. */ @Parameter private String[] descriptors; /** * A list of references to assembly descriptors available on the plugin's classpath. The default classpath * includes these built-in descriptors: bin, * jar-with-dependencies, src, and * project. You can add others by adding dependencies * to the plugin. */ @Parameter private String[] descriptorRefs; /** * Directory to scan for descriptor files in. NOTE: This may not work correctly with assembly components. */ @Parameter private File descriptorSourceDirectory; /** * This is the base directory from which archive files are created. This base directory pre-pended to any * <directory> specifications in the assembly descriptor. This is an optional parameter. */ @Parameter private File archiveBaseDirectory; /** * Predefined Assembly Descriptor Id's. You can select bin, jar-with-dependencies, or src. * * @deprecated Please use descriptorRefs instead */ @Deprecated @Parameter( property = "descriptorId" ) protected String descriptorId; /** * Assembly XML Descriptor file. This must be the path to your customized descriptor file. * * @deprecated Please use descriptors instead */ @Deprecated @Parameter( property = "descriptor" ) protected String descriptor; /** * Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: "warn" * (default), "fail", "truncate", "gnu", or "omit". */ @Parameter( property = "assembly.tarLongFileMode", defaultValue = "warn" ) private String tarLongFileMode; /** * Base directory of the project. */ @Parameter( defaultValue = "${project.basedir}", required = true, readonly = true ) private File basedir; /** * Maven ProjectHelper. */ @Component private MavenProjectHelper projectHelper; /** * Maven shared filtering utility. */ @Component private MavenFileFilter mavenFileFilter; /** * The Maven Session Object */ @Component private MavenSession mavenSession; /** * Temporary directory that contain the files to be assembled. */ @Parameter( defaultValue = "${project.build.directory}/archive-tmp", required = true, readonly = true ) private File tempRoot; /** * Directory for site generated. */ @Parameter( defaultValue = "${project.reporting.outputDirectory}", readonly = true ) private File siteDirectory; /** * Set to true to include the site generated by site:site goal. * * @deprecated Please set this variable in the assembly descriptor instead */ @Deprecated @Parameter( property = "includeSite", defaultValue = "false" ) private boolean includeSite; /** * Set to false to exclude the assembly id from the assembly final name. */ @Parameter( property = "assembly.appendAssemblyId", defaultValue = "true" ) protected boolean appendAssemblyId; /** * Set to true in order to not fail when a descriptor is missing. */ @Parameter( property = "assembly.ignoreMissingDescriptor", defaultValue = "false" ) protected boolean ignoreMissingDescriptor; /** * This is a set of instructions to the archive builder, especially for building .jar files. It enables you to * specify a Manifest file for the jar, in addition to other options. * See Maven Archiver Reference. */ @Parameter private MavenArchiveConfiguration archive; /** * The list of extra filter properties files to be used along with System properties, project * properties, and filter properties files specified in the POM build/filters section, which * should be used for the filtering during the current mojo execution. *
* Normally, these will be configured from a plugin's execution section, to provide a different * set of filters for a particular execution. */ @Parameter protected List filters; /** * Controls whether the assembly plugin tries to attach the resulting assembly to the project. * * @since 2.2-beta-1 */ @Parameter( property = "assembly.attach", defaultValue = "true" ) private boolean attach; /** * Indicates if zip archives (jar,zip etc) being added to the assembly should be compressed again. * Compressing again can result in smaller archive size, but gives noticeably longer execution time. * * @since 2.4 */ @Parameter( defaultValue = "true" ) private boolean recompressZippedFiles; /** */ @Component private AssemblyArchiver assemblyArchiver; /** */ @Component private AssemblyReader assemblyReader; /** * Allows additional configuration options that are specific to a particular type of archive format. This is * intended to capture an XML configuration that will be used to reflectively setup the options on the archiver * instance.
* For instance, to direct an assembly with the "ear" format to use a particular deployment descriptor, you should * specify the following for the archiverConfig value in your plugin configuration:
*

*

     * <appxml>${project.basedir}/somepath/app.xml</appxml>
     * 
* * @since 2.2-beta-3 */ @Parameter private PlexusConfiguration archiverConfig; /** * This will cause the assembly to run only at the top of a given module tree. That is, run in the project contained * in the same folder where the mvn execution was launched. * * @since 2.2-beta-4 */ @Parameter( property = "assembly.runOnlyAtExecutionRoot", defaultValue = "false" ) private boolean runOnlyAtExecutionRoot; /** * This will cause the assembly to only update an existing archive, if it exists. *

* Note: The property that can be used on the command line * was misspelled as "assembly.updatOnly" in versions prior to version 2.4. *

* * @since 2.2 */ @Parameter( property = "assembly.updateOnly", defaultValue = "false" ) private boolean updateOnly; /** *

* will use the jvm chmod, this is available for user and all level group level will be ignored *

* * @since 2.2 */ @Parameter( property = "assembly.useJvmChmod", defaultValue = "false" ) private boolean useJvmChmod; /** *

* Set to true in order to avoid all chmod calls. *

*

*

* NOTE: This will cause the assembly plugin to DISREGARD all fileMode/directoryMode settings in the * assembly descriptor, and all file permissions in unpacked dependencies! *

* * @since 2.2 */ @Parameter( property = "assembly.ignorePermissions", defaultValue = "false" ) private boolean ignorePermissions; /** * Create the binary distribution. * * @throws org.apache.maven.plugin.MojoExecutionException * */ public void execute() throws MojoExecutionException, MojoFailureException { if ( skipAssembly ) { getLog().info( "Assemblies have been skipped per configuration of the skipAssembly parameter." ); return; } // run only at the execution root. if ( runOnlyAtExecutionRoot && !isThisTheExecutionRoot() ) { getLog().info( "Skipping the assembly in this project because it's not the Execution Root" ); return; } List assemblies; try { assemblies = assemblyReader.readAssemblies( this ); } catch ( final AssemblyReadException e ) { throw new MojoExecutionException( "Error reading assemblies: " + e.getMessage(), e ); } catch ( final InvalidAssemblerConfigurationException e ) { throw new MojoFailureException( assemblyReader, e.getMessage(), "Mojo configuration is invalid: " + e.getMessage() ); } // TODO: include dependencies marked for distribution under certain formats // TODO: how, might we plug this into an installer, such as NSIS? boolean warnedAboutMainProjectArtifact = false; for (final Assembly assembly : assemblies) { try { final String fullName = AssemblyFormatUtils.getDistributionName(assembly, this); List effectiveFormats = formats; if (effectiveFormats == null || effectiveFormats.size() == 0) { effectiveFormats = assembly.getFormats(); } if (effectiveFormats == null || effectiveFormats.size() == 0) { throw new MojoFailureException("No formats specified in the execution parameters or the assembly descriptor."); } for (final String format : effectiveFormats) { final File destFile = assemblyArchiver.createArchive(assembly, fullName, format, this, isRecompressZippedFiles()); final MavenProject project = getProject(); final String classifier = getClassifier(); final String type = project.getArtifact() .getType(); if (attach && destFile.isFile()) { if (isAssemblyIdAppended()) { projectHelper.attachArtifact(project, format, assembly.getId(), destFile); } else if (classifier != null) { projectHelper.attachArtifact(project, format, classifier, destFile); } else if (!"pom".equals(type) && format.equals(type)) { if (!warnedAboutMainProjectArtifact) { final StringBuilder message = new StringBuilder(); message.append("Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing."); message.append("\nInstead of attaching the assembly file: ") .append(destFile) .append(", it will become the file for main project artifact."); message.append("\nNOTE: If multiple descriptors or descriptor-formats are provided for this project, the value of this file will be non-deterministic!"); getLog().warn(message); warnedAboutMainProjectArtifact = true; } final File existingFile = project.getArtifact() .getFile(); if ((existingFile != null) && existingFile.exists()) { getLog().warn("Replacing pre-existing project main-artifact file: " + existingFile + "\nwith assembly file: " + destFile); } project.getArtifact() .setFile(destFile); } else { projectHelper.attachArtifact(project, format, null, destFile); } } else if (attach) { getLog().warn("Assembly file: " + destFile + " is not a regular file (it may be a directory). It cannot be attached to the project build for installation or deployment."); } } } catch (final ArchiveCreationException e) { throw new MojoExecutionException("Failed to create assembly: " + e.getMessage(), e); } catch (final AssemblyFormattingException e) { throw new MojoExecutionException("Failed to create assembly: " + e.getMessage(), e); } catch (final InvalidAssemblerConfigurationException e) { throw new MojoFailureException(assembly, "Assembly is incorrectly configured: " + assembly.getId(), "Assembly: " + assembly.getId() + " is not configured correctly: " + e.getMessage()); } } } /** * Returns true if the current project is located at the Execution Root Directory (where mvn was launched) * * @return */ protected boolean isThisTheExecutionRoot() { final Log log = getLog(); log.debug( "Root Folder:" + mavenSession.getExecutionRootDirectory() ); log.debug( "Current Folder:" + basedir ); final boolean result = mavenSession.getExecutionRootDirectory() .equalsIgnoreCase( basedir.toString() ); if ( result ) { log.debug( "This is the execution root." ); } else { log.debug( "This is NOT the execution root." ); } return result; } protected AssemblyArchiver getAssemblyArchiver() { return assemblyArchiver; } protected AssemblyReader getAssemblyReader() { return assemblyReader; } public File getBasedir() { return basedir; } /** * {@inheritDoc} * * @deprecated This has been replaced by {@link #getDescriptors()} */ @Deprecated public String getDescriptor() { return descriptor; } /** * {@inheritDoc} * * @deprecated This has been replaced by {@link #getDescriptorReferences()} */ @Deprecated public String getDescriptorId() { return descriptorId; } public String[] getDescriptorReferences() { return descriptorRefs; } public File getDescriptorSourceDirectory() { return descriptorSourceDirectory; } public String[] getDescriptors() { return descriptors; } public abstract MavenProject getProject(); public File getSiteDirectory() { return siteDirectory; } public boolean isSiteIncluded() { return includeSite; } public String getFinalName() { return finalName; } public boolean isAssemblyIdAppended() { return appendAssemblyId; } public String getTarLongFileMode() { return tarLongFileMode; } public File getOutputDirectory() { return outputDirectory; } public MavenArchiveConfiguration getJarArchiveConfiguration() { return archive; } public File getWorkingDirectory() { return workDirectory; } public ArtifactRepository getLocalRepository() { return localRepository; } public File getTemporaryRootDirectory() { return tempRoot; } public File getArchiveBaseDirectory() { return archiveBaseDirectory; } public List getFilters() { if ( filters == null ) { filters = getProject().getBuild() .getFilters(); if ( filters == null ) { filters = Collections.emptyList(); } } return filters; } public List getReactorProjects() { return reactorProjects; } public String getClassifier() { // TODO Auto-generated method stub return null; } protected MavenProjectHelper getProjectHelper() { return projectHelper; } public void setAppendAssemblyId( final boolean appendAssemblyId ) { this.appendAssemblyId = appendAssemblyId; } public void setArchive( final MavenArchiveConfiguration archive ) { this.archive = archive; } public void setArchiveBaseDirectory( final File archiveBaseDirectory ) { this.archiveBaseDirectory = archiveBaseDirectory; } public void setAssemblyArchiver( final AssemblyArchiver assemblyArchiver ) { this.assemblyArchiver = assemblyArchiver; } public void setAssemblyReader( final AssemblyReader assemblyReader ) { this.assemblyReader = assemblyReader; } public void setBasedir( final File basedir ) { this.basedir = basedir; } public void setClassifier( final String classifier ) { this.classifier = classifier; } /** * {@inheritDoc} * * @deprecated This has been replaced by {@link #setDescriptors(String[])} */ @Deprecated public void setDescriptor( final String descriptor ) { this.descriptor = descriptor; } /** * {@inheritDoc} * * @deprecated This has been replaced by {@link #setDescriptorRefs(String[])} */ @Deprecated public void setDescriptorId( final String descriptorId ) { this.descriptorId = descriptorId; } public void setDescriptorRefs( final String[] descriptorRefs ) { this.descriptorRefs = descriptorRefs; } public void setDescriptors( final String[] descriptors ) { this.descriptors = descriptors; } public void setDescriptorSourceDirectory( final File descriptorSourceDirectory ) { this.descriptorSourceDirectory = descriptorSourceDirectory; } public void setFilters( final List filters ) { this.filters = filters; } public void setFinalName( final String finalName ) { this.finalName = finalName; } public void setIncludeSite( final boolean includeSite ) { this.includeSite = includeSite; } public void setLocalRepository( final ArtifactRepository localRepository ) { this.localRepository = localRepository; } public void setOutputDirectory( final File outputDirectory ) { this.outputDirectory = outputDirectory; } public void setProjectHelper( final MavenProjectHelper projectHelper ) { this.projectHelper = projectHelper; } public void setReactorProjects( final List reactorProjects ) { this.reactorProjects = reactorProjects; } public void setSiteDirectory( final File siteDirectory ) { this.siteDirectory = siteDirectory; } public void setTarLongFileMode( final String tarLongFileMode ) { this.tarLongFileMode = tarLongFileMode; } public void setTempRoot( final File tempRoot ) { this.tempRoot = tempRoot; } public void setWorkDirectory( final File workDirectory ) { this.workDirectory = workDirectory; } public List getRemoteRepositories() { return remoteRepositories; } public boolean isDryRun() { return dryRun; } public boolean isIgnoreDirFormatExtensions() { return ignoreDirFormatExtensions; } public boolean isIgnoreMissingDescriptor() { return ignoreMissingDescriptor; } public void setIgnoreMissingDescriptor( final boolean ignoreMissingDescriptor ) { this.ignoreMissingDescriptor = ignoreMissingDescriptor; } public MavenSession getMavenSession() { return mavenSession; } public String getArchiverConfig() { return archiverConfig == null ? null : archiverConfig.toString(); } public MavenFileFilter getMavenFileFilter() { return mavenFileFilter; } public boolean isUpdateOnly() { return updateOnly; } public boolean isUseJvmChmod() { return useJvmChmod; } public boolean isIgnorePermissions() { return ignorePermissions; } public String getEncoding() { return encoding; } protected boolean isRecompressZippedFiles() { return recompressZippedFiles; } public String getEscapeString() { return escapeString; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy