
org.fusesource.mvnplugins.notices.util.DependencyPom Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of maven-notices-plugin Show documentation
Show all versions of maven-notices-plugin Show documentation
A plugin for merging all legal notices for all jars in a repository.
The newest version!
package org.fusesource.mvnplugins.notices.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Build;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Exclusion;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.io.DefaultModelWriter;
import org.apache.maven.model.io.ModelWriter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.invoker.DefaultInvocationRequest;
import org.apache.maven.shared.invoker.DefaultInvoker;
import org.apache.maven.shared.invoker.InvocationRequest;
import org.apache.maven.shared.invoker.InvocationResult;
import org.apache.maven.shared.invoker.Invoker;
import org.apache.maven.shared.invoker.MavenInvocationException;
import org.apache.maven.shared.invoker.PrintStreamHandler;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
public class DependencyPom {
private MavenProject project;
private Model model;
private String projectVersion;
private File file;
private ArtifactRepository localRepository;
private List extraDependencies;
private MavenSession session;
private List excludeDependencies;
public DependencyPom(MavenProject project, ArtifactRepository localRepository, String extraDependencies, String defaultParent, String excludeDependencies) {
this.project = project;
this.localRepository = localRepository;
this.extraDependencies = new ArrayList();
if (extraDependencies != null) {
for (String depStr : extraDependencies.split(",")) {
String[] depStrSplit = depStr.split(":");
Dependency dep = new Dependency();
dep.setGroupId(depStrSplit[0]);
dep.setArtifactId(depStrSplit[1]);
dep.setVersion(depStrSplit[2]);
this.extraDependencies.add(dep);
}
}
this.excludeDependencies = new ArrayList();
if (excludeDependencies != null) {
for (String depStr : excludeDependencies.split(",")) {
String[] depStrSplit = depStr.split(":");
Dependency dep = new Dependency();
dep.setGroupId(depStrSplit[0]);
dep.setArtifactId(depStrSplit[1]);
this.excludeDependencies.add(dep);
}
}
model = project.getOriginalModel();
model.setPackaging("jar");
model.setProfiles(null);
model.setBuild(null);
model.setArtifactId(model.getArtifactId() + "-dependencies");
projectVersion = project.getVersion();
model.setVersion(projectVersion);
setParent(defaultParent);
Build build = new Build();
model.setBuild(build);
}
private void setParent(String defaultParent) {
if (defaultParent != null && !defaultParent.equals("")) {
// hack to go from maven coordinate string to Parent obj. TODO any Maven util class to do this?
String[] strings = defaultParent.split(":");
if (strings.length >= 3) {
model.getParent().setGroupId(strings[0]);
model.getParent().setArtifactId(strings[1]);
if ("VERSION".equals(strings[2])) {
model.getParent().setVersion(projectVersion);
} else {
model.getParent().setVersion(strings[2]);
}
if (strings.length == 4) {
model.getParent().setRelativePath(strings[3]);
} else {
model.getParent().setRelativePath(null);
}
}
}
}
public void addPlugin(Plugin plugin) {
model.getBuild().addPlugin(plugin);
}
public void generatePom(String repositories, String targetDir) throws IOException {
List loadDependenciesFromRepos = loadDependenciesFromRepos(repositories);
loadDependenciesFromRepos.addAll(extraDependencies);
model.setDependencies(loadDependenciesFromRepos);
project.getProperties().put("skipTests", "true");
model.setProperties(project.getProperties());
file = new File(targetDir, "dependency-pom.xml");
if (file.exists()) {
file.delete();
}
ModelWriter writer = new DefaultModelWriter();
writer.write(file, null, model);
}
public File buildPom() throws MavenInvocationException {
if (file != null) {
InvocationRequest request = new DefaultInvocationRequest();
request.setPomFile(file);
request.setBaseDirectory(file.getParentFile());
request.setLocalRepositoryDirectory(new File(localRepository.getBasedir()));
request.setGoals(Collections.singletonList("package"));
request.setProfiles(project.getActiveProfiles());
request.setShellEnvironmentInherited(true);
if (session.getRequest().getUserSettingsFile().exists()) {
request.setUserSettingsFile(session.getRequest().getUserSettingsFile());
}
if (session.getRequest().getLoggingLevel() == MavenExecutionRequest.LOGGING_LEVEL_DEBUG) {
request.setDebug(true);
}
request.setOffline(session.getRequest().isOffline());
PrintStream invokerLog = null;
InvocationResult invocationResult = null;
try {
invokerLog = new PrintStream(new FileOutputStream(file.getAbsoluteFile().toString() + ".log"));
request.setOutputHandler(new PrintStreamHandler(invokerLog, false));
Invoker invoker = new DefaultInvoker();
invocationResult = invoker.execute(request);
} catch (FileNotFoundException e) {
} finally {
if (invokerLog != null) {
invokerLog.close();
}
}
return new File(project.getBasedir() + File.separator + "target"
+ File.separator + "target" + File.separator + model.getArtifactId() + "-" + projectVersion + ".jar");
}
return null;
}
private List loadDependenciesFromRepos(String repositories) {
if (repositories.contains(",")) {
List deps = new ArrayList();
for (String repo : repositories.split(",")) {
List loadDependenciesFromRepo = loadDependenciesFromRepo(new File(repo));
for (Dependency dep : loadDependenciesFromRepo) {
if (dep != null && !dependencyExists(dep, deps)) {
deps.add(dep);
}
}
}
return deps;
} else {
return loadDependenciesFromRepo(new File(repositories));
}
}
@SuppressWarnings("unchecked")
private List loadDependenciesFromRepo(File repo) {
Iterator jars = FileUtils.listFiles(repo, new String[] { "jar" }, true).iterator();
List deps = new ArrayList();
while (jars.hasNext()) {
File jar = jars.next();
if (!jar.getName().contains("tests.jar") && !jar.getName().contains("sources.jar") && !jar.getName().contains("javadoc.jar") && !jar.getName().contains("classes.jar")) {
Dependency dependencyFromJar = dependencyFromJar(jar, repo);
if (dependencyFromJar != null && !dependencyExists(dependencyFromJar, deps) && !dependencyExists(dependencyFromJar, excludeDependencies)) {
deps.add(dependencyFromJar);
}
}
}
return deps;
}
private boolean dependencyExists(Dependency dependencyFromJar, List deps) {
for (Dependency dep : deps) {
if (dep.getGroupId().equals(dependencyFromJar.getGroupId()) &&
dep.getArtifactId().equals(dependencyFromJar.getArtifactId())) {
return true;
}
}
return false;
}
private Dependency dependencyFromJar(File jar, File repo) {
Dependency dep = new Dependency();
String version = jar.getParentFile().getName();
String artifactId = jar.getParentFile().getParentFile().getName();
String groupIdSep = StringUtils.replace(jar.getParentFile().getParentFile().getParentFile().getPath(), repo.getPath(), "");
String groupId = groupIdSep.replace(File.separatorChar, '.');
groupId = groupId.startsWith(".") ? groupId.substring(1) : groupId;
groupId = groupId.endsWith(".") ? groupId.substring(0, groupId.length() - 1) : groupId;
String fileName = jar.getName();
int idxOfVersion = fileName.lastIndexOf(version);
int idxOfLastDot = fileName.lastIndexOf(".");
if (idxOfVersion > 0 && idxOfVersion + version.length() < idxOfLastDot && !fileName.contains("SNAPSHOT")) {
String classifier = fileName.substring(idxOfVersion + version.length() + 1, idxOfLastDot);
dep.setClassifier(classifier);
}
dep.setArtifactId(artifactId);
dep.setGroupId(groupId);
dep.setVersion(version);
return dep;
}
public void setSession(MavenSession session) {
this.session = session;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy