package io.trygvis.maven.classpath; import static java.util.Collections.singletonList; import static java.util.Collections.sort; import static org.apache.maven.plugins.annotations.LifecyclePhase.GENERATE_RESOURCES; import static org.apache.maven.plugins.annotations.ResolutionScope.RUNTIME; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.IOUtil; import org.sonatype.plexus.build.incremental.BuildContext; /** * Writes the path of each compile/runtime dependency of a project to a file, * where each path is relative to the root of a maven repository. *

* For example, if the project depends on commons-lang 2.6 and commons-math 2.2, * then the file written will contain the line: *

 * commons-lang/commons-lang/2.6/commons-lang-2.6.jar
 * org/apache/commons/commons-math/2.2/commons-math-2.2.jar
 * 
*/ @Mojo(name = "classpath", defaultPhase = GENERATE_RESOURCES, requiresDependencyCollection = RUNTIME) public class ClasspathMojo extends AbstractMojo { @Component private BuildContext context; @Parameter(property = "project", required = true, readonly = true) private MavenProject project; @Parameter(defaultValue = "${project.build.directory}/generated-resources/classpath", property = "classpathOutputDirectory") private File outputDirectory; @Parameter(defaultValue = "classpath.txt") private String file; @Parameter(property = "sort", defaultValue = "false") private boolean sort; public void execute() throws MojoExecutionException, MojoFailureException { List paths = buildClasspath(); writeClasspath(paths); addGeneratedResourceToBuild(); } @SuppressWarnings("unchecked") private List buildClasspath() { ArtifactRepositoryLayout layout = new DefaultRepositoryLayout(); // List artifacts = project.getRuntimeArtifacts(); // Collection artifacts = project.getDependencyArtifacts(); Collection artifacts = project.getArtifacts(); List paths = new ArrayList(artifacts.size()); for (Artifact artifact : artifacts) { // System.out.println("artifact.getId() = " + artifact.getId()); String key = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getClassifier() + ":" + artifact.getVersion() + ":" + artifact.getType() + ":" + artifact.getClassifier(); // System.out.println("key: " + key); paths.add(key); } if (sort) { sort(paths); } return paths; } private void writeClasspath(List paths) throws MojoFailureException, MojoExecutionException { File output = new File(outputDirectory, file); File directory = output.getParentFile(); if (!directory.exists() && ! directory.mkdirs()) { throw new MojoFailureException("Could not create directory: " + directory); } try { writeClasspathFile(output, paths); } catch (IOException ex) { throw new MojoExecutionException("Could not write to " + file, ex); } } private void writeClasspathFile(File output, List classpath) throws IOException { OutputStream os = context.newFileOutputStream(output); PrintWriter writer = null; try { writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); for (String s : classpath) { writer.println(s); } } finally { IOUtil.close(writer); os.close(); } } private void addGeneratedResourceToBuild() { Resource resource = new Resource(); resource.setDirectory(outputDirectory.getPath()); resource.setIncludes(singletonList(file)); project.addResource(resource); } }