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 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.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
import org.codehaus.plexus.configuration.PlexusConfiguration;

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

/**
 * @author Brett Porter
 * @author Vincent Siveton
 * @version $Id: AbstractAssemblyMojo.java 775788 2009-05-18 01:09:27Z brianf $
 */
public abstract class AbstractAssemblyMojo
    extends AbstractMojo
    implements AssemblerConfigurationSource
{

    /**
     * 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 expression="${skipAssembly}" default-value="false"
     */
    private boolean skipAssembly;

    /**
     * If this flag is set, everything up to the call to Archiver.createArchive() will be executed.
     *
     * @parameter expression="${assembly.dryRun}" default-value="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 default-value="true" */ private boolean ignoreDirFormatExtensions; /** * Local Maven repository where artifacts are cached during the build process. * * @parameter default-value="${localRepository}" * @required * @readonly */ private ArtifactRepository localRepository; /** * @parameter default-value="${project.remoteArtifactRepositories}" * @required * @readonly */ private List remoteRepositories; /** * Contains the full list of projects in the reactor. * * @parameter default-value="${reactorProjects}" * @required * @readonly */ private List reactorProjects; /** * The output directory of the assembled distribution file. * * @parameter default-value="${project.build.directory}" * @required */ private File outputDirectory; /** * The filename of the assembled distribution file. * * @parameter default-value="${project.build.finalName}" * @required */ private String finalName; /** * Directory to unpack JARs into if needed * * @parameter default-value="${project.build.directory}/assembly/work" * @required */ private File workDirectory; /** * 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. * * @parameter expression="${classifier}" * @deprecated Please use the Assembly's id for classifier instead */ private String classifier; /** * A list of descriptor files to generate from. * * @parameter */ private String[] descriptors; /** * A list of built-in descriptor references to generate from. You can select from bin, * jar-with-dependencies, or src. * * @parameter */ private String[] descriptorRefs; /** * Directory to scan for descriptor files in. * * @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. * * @parameter expression="${descriptorId}" * @deprecated Please use descriptorRefs instead */ protected String descriptorId; /** * Assembly XML Descriptor file. This must be the path to your customized descriptor file. * * @parameter expression="${descriptor}" * @deprecated Please use descriptors instead */ 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 expression="${tarLongFileMode}" default-value="warn" */ private String tarLongFileMode; /** * Base directory of the project. * * @parameter default-value="${basedir}" * @required * @readonly */ private File basedir; /** * Maven ProjectHelper. * * @component */ private MavenProjectHelper projectHelper; /** * The Maven Session Object * * @parameter expression="${session}" * @required * @readonly */ private MavenSession mavenSession; /** * Temporary directory that contain the files to be assembled. * * @parameter default-value="${project.build.directory}/archive-tmp" * @required * @readonly */ private File tempRoot; /** * Directory for site generated. * * @parameter default-value="${project.reporting.outputDirectory}" * @readonly */ private File siteDirectory; /** * Set to true to include the site generated by site:site goal. * * @parameter expression="${includeSite}" default-value="false" * @deprecated Please set this variable in the assembly descriptor instead */ private boolean includeSite; /** * Set to false to exclude the assembly id from the assembly final name. * * @parameter expression="${appendAssemblyId}" default-value="true" */ protected boolean appendAssemblyId; /** * Set to true in order to not fail when a descriptor is missing. * @parameter expression="${ignoreMissingDescriptor}" default-value="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. * * @parameter */ private MavenArchiveConfiguration archive; /** * @parameter */ protected List filters; /** * Controls whether the assembly plugin tries to attach the resulting * assembly to the project. * * @parameter expression="${attach}" default-value="true" * @since 2.2-beta-1 */ private boolean attach; /** * @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 * appXml file, you should specify the following for the archiverConfig value * in your plugin configuration: *
*
     * <appXml>${project.basedir}/somepath/app.xml</appXml>
     * 
* * @parameter * @since 2.2-beta-3 */ 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. * @parameter expression="${runOnlyAtExecutionRoot}" default-value="false" * @since 2.2-beta-4 */ private boolean runOnlyAtExecutionRoot; /** * 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 ( AssemblyReadException e ) { throw new MojoExecutionException( "Error reading assemblies: " + e.getMessage(), e ); } catch ( 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 ( Iterator assemblyIterator = assemblies.iterator(); assemblyIterator.hasNext(); ) { Assembly assembly = (Assembly) assemblyIterator.next(); try { String fullName = AssemblyFormatUtils.getDistributionName( assembly, this ); for ( Iterator formatIterator = assembly.getFormats().iterator(); formatIterator.hasNext(); ) { String format = (String) formatIterator.next(); File destFile = assemblyArchiver.createArchive( assembly, fullName, format, this ); MavenProject project = getProject(); String classifier = getClassifier(); 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 ) { StringBuffer message = new StringBuffer(); 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; } 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 { 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 ( ArchiveCreationException e ) { throw new MojoExecutionException( "Failed to create assembly: " + e.getMessage(), e ); } catch ( AssemblyFormattingException e ) { throw new MojoExecutionException( "Failed to create assembly: " + e.getMessage(), e ); } catch ( 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() { Log log = this.getLog(); log.debug("Root Folder:" + mavenSession.getExecutionRootDirectory()); log.debug("Current Folder:"+ basedir ); 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; } public String getDescriptor() { return descriptor; } 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(); } 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( boolean appendAssemblyId ) { this.appendAssemblyId = appendAssemblyId; } public void setArchive( MavenArchiveConfiguration archive ) { this.archive = archive; } public void setArchiveBaseDirectory( File archiveBaseDirectory ) { this.archiveBaseDirectory = archiveBaseDirectory; } public void setAssemblyArchiver( AssemblyArchiver assemblyArchiver ) { this.assemblyArchiver = assemblyArchiver; } public void setAssemblyReader( AssemblyReader assemblyReader ) { this.assemblyReader = assemblyReader; } public void setBasedir( File basedir ) { this.basedir = basedir; } public void setClassifier( String classifier ) { this.classifier = classifier; } public void setDescriptor( String descriptor ) { this.descriptor = descriptor; } public void setDescriptorId( String descriptorId ) { this.descriptorId = descriptorId; } public void setDescriptorRefs( String[] descriptorRefs ) { this.descriptorRefs = descriptorRefs; } public void setDescriptors( String[] descriptors ) { this.descriptors = descriptors; } public void setDescriptorSourceDirectory( File descriptorSourceDirectory ) { this.descriptorSourceDirectory = descriptorSourceDirectory; } public void setFilters( List filters ) { this.filters = filters; } public void setFinalName( String finalName ) { this.finalName = finalName; } public void setIncludeSite( boolean includeSite ) { this.includeSite = includeSite; } public void setLocalRepository( ArtifactRepository localRepository ) { this.localRepository = localRepository; } public void setOutputDirectory( File outputDirectory ) { this.outputDirectory = outputDirectory; } public void setProjectHelper( MavenProjectHelper projectHelper ) { this.projectHelper = projectHelper; } public void setReactorProjects( List reactorProjects ) { this.reactorProjects = reactorProjects; } public void setSiteDirectory( File siteDirectory ) { this.siteDirectory = siteDirectory; } public void setTarLongFileMode( String tarLongFileMode ) { this.tarLongFileMode = tarLongFileMode; } public void setTempRoot( File tempRoot ) { this.tempRoot = tempRoot; } public void setWorkDirectory( 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(boolean ignoreMissingDescriptor) { this.ignoreMissingDescriptor = ignoreMissingDescriptor; } public MavenSession getMavenSession() { return this.mavenSession; } public String getArchiverConfig() { return archiverConfig == null ? null : archiverConfig.toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy