package com.fizzed.stork.maven;
import com.fizzed.stork.assembly.AssemblyUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
/**
* Stages and assemble a maven project into a stork assembly tarball.
*
* @author joelauer
*/
@Mojo(name = "assembly",
defaultPhase = LifecyclePhase.PACKAGE,
threadSafe = true,
requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
requiresDependencyCollection = ResolutionScope.COMPILE_PLUS_RUNTIME
)
public class AssemblyMojo extends AbstractMojo {
/**
* Directory to stage assembly.
*
* @since 1.2.0
*/
@Parameter(property = "stageDirectory", defaultValue = "${project.build.directory}/stork", required = true)
protected File stageDirectory;
/**
* Directory to output assembly.
*
* @since 1.2.0
*/
@Parameter(property = "outputDirectory", defaultValue = "${project.build.directory}", required = true)
protected File outputDirectory;
/**
* Final name of assembly.
*
* @since 1.2.0
*/
@Parameter(property = "finalName", defaultValue = "${project.build.finalName}", required = true)
protected String finalName;
@Parameter( defaultValue = "${project}", readonly = true )
protected MavenProject project;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if (!stageDirectory.exists()) {
getLog().info("Creating stage directory: " + stageDirectory);
stageDirectory.mkdirs();
}
try {
List<Artifact> artifacts = artifactsToStage();
//
// copy runtime dependencies to stage directory...
//
File stageLibDir = new File(stageDirectory, "lib");
// directly pulled from maven Project.java (how it returns the getRuntimeClasspathElements() value)
for (Artifact a : artifacts) {
File f = a.getFile();
if (f == null) {
getLog().error("Project artifact was null (maybe not compiled into jar yet?)");
} else {
// generate final jar name (which appends groupId)
String artifactName = a.getGroupId() + "." + a.getArtifactId() + "-" + a.getVersion() + ".jar";
File stageArtificateFile = new File(stageLibDir, artifactName);
FileUtils.copyFile(f, stageArtificateFile);
}
}
// copy conf, bin, and share dirs
File binDir = new File(project.getBasedir(), "bin");
if (binDir.exists()) {
File stageBinDir = new File(stageDirectory, "bin");
FileUtils.copyDirectory(binDir, stageBinDir);
}
File confDir = new File(project.getBasedir(), "conf");
if (confDir.exists()) {
File stageConfDir = new File(stageDirectory, "conf");
FileUtils.copyDirectory(confDir, stageConfDir);
}
File shareDir = new File(project.getBasedir(), "share");
if (shareDir.exists()) {
File stageShareDir = new File(stageDirectory, "share");
FileUtils.copyDirectory(shareDir, stageShareDir);
}
// copy standard project resources (e.g. readme*, license*, changelog*, release* files)
AssemblyUtils.copyStandardProjectResources(project.getBasedir(), stageDirectory);
// tarball it up
File tgzFile = AssemblyUtils.createTGZ(outputDirectory, stageDirectory, finalName);
getLog().info("Generated maven stork assembly: " + tgzFile);
} catch (Exception e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
public List<Artifact> artifactsToStage() {
List<Artifact> artifacts = new ArrayList<>();
// include project artifact?
if (!shouldArtifactBeStaged(project.getArtifact())) {
getLog().info("Project artifact may have a classifier or is not of type jar (will not be staged)");
} else {
artifacts.add(project.getArtifact());
}
// any additional artifacts attached to this project?
for (Artifact a : project.getAttachedArtifacts()) {
if (shouldArtifactBeStaged(a)) {
artifacts.add(a);
}
}
// get resolved artifacts as well
for (Artifact a : project.getArtifacts()) {
if (a.getArtifactHandler().isAddedToClasspath() && (Artifact.SCOPE_COMPILE.equals(a.getScope()) || Artifact.SCOPE_RUNTIME.equals(a.getScope()))) {
artifacts.add(a);
}
}
return artifacts;
}
public boolean shouldArtifactBeStaged(Artifact a) {
return !a.hasClassifier() && (a.getType() == null || a.getType().equalsIgnoreCase("jar"));
}
}