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.
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 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>