package com.ximple.eofms.maven;
import org.apache.maven.artifact.Artifact;
// Maven and Plexus dependencies
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.FileUtils;
// J2SE dependencies
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
// Note: javadoc in class and fields descriptions must be XHTML.
/**
* Copies .jar
files in a single directory. Dependencies are copied as well,
* except if already presents.
*
* @goal collect
* @phase package
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux
*/
public class JarCollector extends AbstractMojo {
/**
* The sub directory to create inside the "target" directory.
*/
private static final String SUB_DIRECTORY = "binaries";
/**
* The directory where JARs are to be copied. It should
* be the "target" directory of the parent {@code pom.xml}.
*/
private String collectDirectory;
/**
* Directory containing the generated JAR.
*
* @parameter expression="${project.build.directory}"
* @required
*/
private String outputDirectory;
/**
* Name of the generated JAR.
*
* @parameter expression="${project.build.finalName}"
* @required
*/
private String jarName;
/**
* Project dependencies.
*
* @parameter expression="${project.artifacts}"
* @required
*/
private Set /**/ dependencies;
/**
* The Maven project running this plugin.
*
* @parameter expression="${project}"
* @required
*/
private MavenProject project;
/**
* Copies the {@code .jar} files to the collect directory.
*
* @throws MojoExecutionException if the plugin execution failed.
*/
public void execute() throws MojoExecutionException {
/*
* Gets the parent "target" directory.
*/
MavenProject parent = project;
while (parent.hasParent()) {
parent = parent.getParent();
}
collectDirectory = parent.getBuild().getDirectory();
/*
* Now collects the JARs.
*/
try {
collect();
} catch (IOException e) {
throw new MojoExecutionException("Error collecting the JAR file.", e);
}
}
/**
* Implementation of the {@link #execute} method.
*/
private void collect() throws MojoExecutionException, IOException {
/*
* Make sure that we are collecting the JAR file from a module which produced
* such file. Some modules use pom packaging, which do not produce any JAR file.
*/
final File jarFile = new File(outputDirectory, jarName + ".jar");
if (!jarFile.isFile()) {
return;
}
/*
* Get the "target" directory of the parent pom.xml and make sure it exists.
*/
File collect = new File(collectDirectory);
if (!collect.exists()) {
if (!collect.mkdir()) {
throw new MojoExecutionException("Failed to create target directory.");
}
}
if (collect.getCanonicalFile().equals(jarFile.getParentFile().getCanonicalFile())) {
/*
* The parent's directory is the same one than this module's directory.
* In other words, this plugin is not executed from the parent POM. Do
* not copy anything, since this is not the place where we want to
* collect the JAR files.
*/
return;
}
/*
* Creates a "binaries" subdirectory inside the "target" directory.
*/
collect = new File(collect, SUB_DIRECTORY);
if (!collect.exists()) {
if (!collect.mkdir()) {
throw new MojoExecutionException("Failed to create binaries directory.");
}
}
int count = 1;
FileUtils.copyFileToDirectory(jarFile, collect);
if (dependencies != null) {
for (final Iterator it = dependencies.iterator(); it.hasNext();) {
final Artifact artifact = (Artifact) it.next();
final String scope = artifact.getScope();
if ((scope != null) // Maven 2.0.6 bug?
&& (scope.equalsIgnoreCase(Artifact.SCOPE_COMPILE)
|| scope.equalsIgnoreCase(Artifact.SCOPE_RUNTIME))) {
final File file = artifact.getFile();
final File copy = new File(collect, file.getName());
if (!copy.exists()) {
/*
* Copies the dependency only if it was not already copied. Note that
* the module's JAR was copied inconditionnaly above (because it may
* be the result of a new compilation). If a Geotools JAR from the
* dependencies list changed, it will be copied inconditionnaly when
* the module for this JAR will be processed by Maven.
*/
FileUtils.copyFileToDirectory(file, collect);
count++;
}
}
}
}
getLog().info("Copied " + count + " JAR to parent directory.");
}
}