This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch feature/SLING-8664 in repository https://gitbox.apache.org/repos/asf/sling-slingstart-maven-plugin.git
commit bbf88d705e8835df545c089b363c41fb013637fc Author: Robert Munteanu <[email protected]> AuthorDate: Fri Aug 30 14:26:57 2019 +0200 SLING-8664 - Sling Starter dependency import for projects built on top of it Add a new 'attach-dependencies-pom' goal which generates a pom to be imported into other projects. --- .../maven/slingstart/AttachDependenciesPom.java | 100 +++++++++++++++++++++ .../sling/maven/slingstart/BuildConstants.java | 2 + .../META-INF/m2e/lifecycle-mapping-metadata.xml | 1 + src/main/resources/META-INF/plexus/components.xml | 1 + 4 files changed, 104 insertions(+) diff --git a/src/main/java/org/apache/sling/maven/slingstart/AttachDependenciesPom.java b/src/main/java/org/apache/sling/maven/slingstart/AttachDependenciesPom.java new file mode 100644 index 0000000..a47488f --- /dev/null +++ b/src/main/java/org/apache/sling/maven/slingstart/AttachDependenciesPom.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.sling.maven.slingstart; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.stream.StreamSupport; + +import org.apache.maven.model.Dependency; +import org.apache.maven.model.DependencyManagement; +import org.apache.maven.model.io.xpp3.MavenXpp3Writer; +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.ResolutionScope; +import org.apache.maven.shared.utils.WriterFactory; +import org.apache.sling.provisioning.model.Artifact; +import org.apache.sling.provisioning.model.Model; +import org.apache.sling.provisioning.model.ModelUtility; + +/** + * Attaches a dependencies pom as project artifact + */ +@Mojo( + name = "attach-dependencies-pom", + defaultPhase = LifecyclePhase.PACKAGE, + requiresDependencyResolution = ResolutionScope.COMPILE, + threadSafe = true + ) +public class AttachDependenciesPom extends AbstractSlingStartMojo { + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + + Model model = ProjectHelper.getRawModel(this.project); + if (usePomVariables) { + model = ModelUtility.applyVariables(model, new PomVariableResolver(project)); + } + if (usePomDependencies) { + model = ModelUtility.applyArtifactVersions(model, new PomArtifactVersionResolver(project, allowUnresolvedPomDependencies)); + } + + // write the model archive + final File outputFile = new File(this.project.getBuild().getDirectory(), project.getBuild().getFinalName() + "-" + BuildConstants.CLASSIFIER_DEPENDENCIES + "." + BuildConstants.TYPE_POM); + outputFile.getParentFile().mkdirs(); + + try { + try ( Writer wf = WriterFactory.newXmlWriter(outputFile) ) { + org.apache.maven.model.Model mavenModel = new org.apache.maven.model.Model(); + mavenModel.setName(project.getName() + " (Dependencies)"); + mavenModel.setGroupId(project.getGroupId()); + mavenModel.setArtifactId(project.getArtifactId()); + mavenModel.setVersion(project.getVersion()); + mavenModel.setDependencyManagement(new DependencyManagement()); + + model.getFeatures().stream() + .flatMap( d -> d.getRunModes().stream() ) + .flatMap( r -> r.getArtifactGroups().stream() ) + .flatMap( ag -> StreamSupport.stream(ag.spliterator(), false)) + .forEach( a -> addDependency(a, mavenModel) ); + + new MavenXpp3Writer().write( wf, mavenModel ); + } + + } catch (IOException e) { + throw new MojoExecutionException("Failed writing dependencies POM", e); + } + + // attach it as an additional artifact + projectHelper.attachArtifact(project, BuildConstants.TYPE_POM, + BuildConstants.CLASSIFIER_DEPENDENCIES, outputFile); + } + + private void addDependency(Artifact a, org.apache.maven.model.Model model) { + Dependency dep = new Dependency(); + dep.setScope("provided"); + dep.setGroupId(a.getGroupId()); + dep.setArtifactId(a.getArtifactId()); + dep.setVersion(a.getVersion()); + + model.getDependencyManagement().addDependency(dep); + } + +} diff --git a/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java b/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java index 3da52da..71907ab 100644 --- a/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java +++ b/src/main/java/org/apache/sling/maven/slingstart/BuildConstants.java @@ -57,6 +57,8 @@ public abstract class BuildConstants { public static final String CLASSIFIER_WEBAPP = "webapp"; public static final String CLASSIFIER_MAR = ModelArchiveWriter.DEFAULT_EXTENSION; + + public static final String CLASSIFIER_DEPENDENCIES = "dependencies"; // Manifest attributes diff --git a/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml b/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml index 4aea0a2..ca2260e 100644 --- a/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml +++ b/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml @@ -23,6 +23,7 @@ <goals> <goal>attach-slingfeature</goal> <goal>attach-modelarchive</goal> + <goal>attach-dependencies-pom</goal> <goal>repository</goal> <goal>package</goal> <goal>prepare-package</goal> diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml index c05d45e..cf8bce6 100644 --- a/src/main/resources/META-INF/plexus/components.xml +++ b/src/main/resources/META-INF/plexus/components.xml @@ -55,6 +55,7 @@ <test>org.apache.maven.plugins:maven-surefire-plugin:test</test> <prepare-package>org.apache.sling:slingstart-maven-plugin:prepare-package</prepare-package> <package> + org.apache.sling:slingstart-maven-plugin:attach-dependencies-pom, org.apache.sling:slingstart-maven-plugin:attach-slingfeature, org.apache.sling:slingstart-maven-plugin:package </package>
