Author: rmannibucau
Date: Tue Jun 20 10:51:19 2017
New Revision: 1799336
URL: http://svn.apache.org/viewvc?rev=1799336&view=rev
Log:
MEECROWAVE-42 auto packaging of mandatory libs
Modified:
openwebbeans/meecrowave/trunk/meecrowave-maven-plugin/src/main/java/org/apache/meecrowave/maven/MeecrowaveBundleMojo.java
Modified:
openwebbeans/meecrowave/trunk/meecrowave-maven-plugin/src/main/java/org/apache/meecrowave/maven/MeecrowaveBundleMojo.java
URL:
http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-maven-plugin/src/main/java/org/apache/meecrowave/maven/MeecrowaveBundleMojo.java?rev=1799336&r1=1799335&r2=1799336&view=diff
==============================================================================
---
openwebbeans/meecrowave/trunk/meecrowave-maven-plugin/src/main/java/org/apache/meecrowave/maven/MeecrowaveBundleMojo.java
(original)
+++
openwebbeans/meecrowave/trunk/meecrowave-maven-plugin/src/main/java/org/apache/meecrowave/maven/MeecrowaveBundleMojo.java
Tue Jun 20 10:51:19 2017
@@ -24,19 +24,36 @@ import org.apache.commons.compress.archi
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Dependency;
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.DefaultDependencyResolutionRequest;
+import org.apache.maven.project.DependencyResolutionException;
+import org.apache.maven.project.DependencyResolutionRequest;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.project.ProjectDependenciesResolver;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.graph.DependencyVisitor;
+import org.eclipse.aether.impl.ArtifactResolver;
+import org.eclipse.aether.repository.LocalRepositoryManager;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.resolution.ArtifactResult;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileVisitResult;
@@ -48,11 +65,14 @@ import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
import java.util.stream.Stream;
import java.util.zip.GZIPOutputStream;
import static java.util.Locale.ENGLISH;
import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
import static
org.apache.maven.plugins.annotations.ResolutionScope.RUNTIME_PLUS_SYSTEM;
@Mojo(name = "bundle", requiresDependencyResolution = RUNTIME_PLUS_SYSTEM)
@@ -104,9 +124,30 @@ public class MeecrowaveBundleMojo extend
@Parameter(defaultValue = "${project}", readonly = true)
private MavenProject project;
+ @Parameter(property = "meecrowave.enforce-commons_cli", defaultValue =
"true")
+ private boolean enforceCommonsCli; // set to false if you use a packaged
version of commons-cli not named commons-cli*.jar
+
+ @Parameter(property = "meecrowave.enforce-meecrowave", defaultValue =
"true")
+ private boolean enforceMeecrowave; // set to false if you package
meecrowave runner
+
@Component
private MavenProjectHelper projectHelper;
+ @Component
+ private ArtifactResolver resolver;
+
+ @Component
+ private RepositorySystem repositorySystem;
+
+ @Component
+ private ProjectDependenciesResolver dependenciesResolver;
+
+ @Parameter(defaultValue = "${repositorySystemSession}")
+ private RepositorySystemSession session;
+
+ @Parameter(defaultValue = "${project.remoteProjectRepositories}")
+ private List<RemoteRepository> remoteRepositories;
+
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if (skip) {
@@ -158,21 +199,46 @@ public class MeecrowaveBundleMojo extend
"# More on
http://openwebbeans.apache.org/meecrowave/meecrowave-core/cli.html\n\n" +
"tomcat-access-log-pattern = %h %l %u %t \"%r\" %s %b
\"%{Referer}i\" \"%{User-Agent}i\"");
write(new File(distroFolder, "logs/you_can_safely_delete.txt"),
DELETE_TEXT);
- project.getArtifacts().stream()
+ final Collection<String> includedArtifacts =
project.getArtifacts().stream()
.filter(this::isIncluded)
- .map(Artifact::getFile)
- .forEach(f -> {
- try {
- Files.copy(f.toPath(), new File(distroFolder, "lib/" +
f.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
- } catch (final IOException e) {
- throw new IllegalStateException(e);
- }
- });
+ .map(a -> {
+ addLib(distroFolder, a.getFile());
+ return a.getArtifactId();
+ }).collect(toList());
if (app.exists()) {
+ addLib(distroFolder, app);
+ }
+ if (enforceCommonsCli && !includedArtifacts.contains("commons-cli")) {
+ addLib(distroFolder, resolve("commons-cli", "commons-cli",
"1.3.1"));
+ }
+ if (enforceMeecrowave &&
!includedArtifacts.contains("meecrowave-core")) {
+ final DependencyResolutionRequest request = new
DefaultDependencyResolutionRequest();
+ request.setMavenProject(new MavenProject() {{
+ getDependencies().add(new Dependency() {{
+ setGroupId("org.apache.meecrowave");
+ setArtifactId("meecrowave-core");
+ setVersion(findVersion());
+ }});
+ }});
+ request.setRepositorySession(session);
try {
- Files.copy(app.toPath(), new File(distroFolder, "lib/" +
app.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
- } catch (final IOException e) {
- throw new IllegalStateException(e);
+
dependenciesResolver.resolve(request).getDependencyGraph().accept(new
DependencyVisitor() {
+ @Override
+ public boolean visitEnter(final DependencyNode node) {
+ return true;
+ }
+
+ @Override
+ public boolean visitLeave(final DependencyNode node) {
+ final org.eclipse.aether.artifact.Artifact artifact =
node.getArtifact();
+ if (artifact != null &&
!includedArtifacts.contains(artifact.getArtifactId())) {
+ addLib(distroFolder, artifact.getFile());
+ }
+ return true;
+ }
+ });
+ } catch (final DependencyResolutionException e) {
+ throw new MojoExecutionException(e.getMessage(), e);
}
}
@@ -216,6 +282,44 @@ public class MeecrowaveBundleMojo extend
}
}
+ private void addLib(final File distroFolder, final File cc) {
+ try {
+ Files.copy(cc.toPath(), new File(distroFolder, "lib/" +
cc.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
+ } catch (final IOException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ private String findVersion() {
+ return new Properties() {{
+ try (final InputStream is =
Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/maven/org.apache.meecrowave/meecrowave-core/pom.properties"))
{
+ if (is != null) {
+ load(is);
+ }
+ } catch (final IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }}.getProperty("version", "0.3.2");
+ }
+
+ private File resolve(final String group, final String artifact, final
String version) throws MojoExecutionException {
+ final DefaultArtifact art = new DefaultArtifact(group, artifact,
"jar", version);
+ final ArtifactRequest artifactRequest = new
ArtifactRequest().setArtifact(art).setRepositories(remoteRepositories);
+
+ final LocalRepositoryManager lrm = session.getLocalRepositoryManager();
+ art.setFile(new File(lrm.getRepository().getBasedir(),
lrm.getPathForLocalArtifact(artifactRequest.getArtifact())));
+
+ try {
+ final ArtifactResult result =
repositorySystem.resolveArtifact(session, artifactRequest);
+ if (result.isMissing()) {
+ throw new MojoExecutionException("Can't find commons-cli,
please add it to the pom.");
+ }
+ return result.getArtifact().getFile();
+ } catch (final ArtifactResolutionException e) {
+ throw new MojoExecutionException(e.getMessage(), e);
+ }
+ }
+
private boolean isIncluded(final Artifact a) {
return !((scopes == null &&
!(Artifact.SCOPE_COMPILE.equals(a.getScope()) ||
Artifact.SCOPE_RUNTIME.equals(a.getScope())))
|| (scopes != null && !scopes.contains(a.getScope())));