diff --git a/demo/osgi-repository/repository/pom.xml b/demo/osgi-repository/repository/pom.xml
index ac45caa6ab..9e8154b58a 100644
--- a/demo/osgi-repository/repository/pom.xml
+++ b/demo/osgi-repository/repository/pom.xml
@@ -17,6 +17,10 @@
${tycho-version}
true
+
+
+ maven
+
diff --git a/tycho-repository-plugin/pom.xml b/tycho-repository-plugin/pom.xml
index a978fa2190..5f41df677a 100644
--- a/tycho-repository-plugin/pom.xml
+++ b/tycho-repository-plugin/pom.xml
@@ -49,6 +49,14 @@
org.osgi.util.promise
1.3.0
+
+ commons-io
+ commons-io
+
+
+ org.codehaus.plexus
+ plexus-archiver
+
diff --git a/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageMavenRepositoryMojo.java b/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageRepositoryMojo.java
similarity index 62%
rename from tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageMavenRepositoryMojo.java
rename to tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageRepositoryMojo.java
index ae771679bb..1865f6cc33 100644
--- a/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageMavenRepositoryMojo.java
+++ b/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageRepositoryMojo.java
@@ -16,6 +16,8 @@
import java.io.IOException;
import java.net.URI;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.execution.MavenSession;
@@ -23,9 +25,12 @@
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
+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.archiver.Archiver;
+import org.codehaus.plexus.archiver.zip.ZipArchiver;
import org.eclipse.tycho.ArtifactType;
import org.eclipse.tycho.MavenArtifactNamespace;
@@ -37,8 +42,8 @@
* Generates an OSGi repository from the current reactor projects
*
*/
-@Mojo(name = "package-maven-repository")
-public class PackageMavenRepositoryMojo extends AbstractMojo {
+@Mojo(name = "package-repository")
+public class PackageRepositoryMojo extends AbstractMojo {
@Parameter(property = "session", readonly = true)
protected MavenSession session;
@@ -64,16 +69,47 @@ public class PackageMavenRepositoryMojo extends AbstractMojo {
@Parameter(property = "project", readonly = true)
private MavenProject project;
+ /**
+ * Specify the used layout, possible values are:
+ *
+ * maven
- all artifacts are referenced with the mvn protocol
+ * and the result can be deployment to a maven repository (either local or
+ * remote)
+ * local
- all artifacts are copied into a folder and
+ * referenced relative to this folder, the result can be
+ *
+ */
+ @Parameter(defaultValue = "maven")
+ private RepositoryLayout repositoryLayout;
+
+ @Component(role = Archiver.class, hint = "zip")
+ private ZipArchiver zipArchiver;
+
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
XMLResourceGenerator resourceGenerator = new XMLResourceGenerator();
resourceGenerator.name(repositoryName);
+ File folder;
+ if (repositoryLayout == RepositoryLayout.local) {
+ folder = new File(destination, FilenameUtils.getBaseName(repositoryFileName));
+ folder.mkdirs();
+ resourceGenerator.base(folder.toURI());
+ } else {
+ folder = null;
+ }
for (MavenProject project : session.getProjects()) {
if (isInteresting(project)) {
ResourceBuilder rb = new ResourceBuilder();
try {
- if (rb.addFile(project.getArtifact().getFile(), new URI("mvn:" + project.getGroupId() + ":"
- + project.getArtifactId() + ":" + project.getVersion()))) {
+ URI uri;
+ File file = project.getArtifact().getFile();
+ if (folder == null) {
+ uri = new URI("mvn:" + project.getGroupId() + ":" + project.getArtifactId() + ":"
+ + project.getVersion());
+ } else {
+ uri = new File(folder, file.getName()).toURI();
+ }
+ if (rb.addFile(project.getArtifact().getFile(), uri)) {
CapReqBuilder identity = new CapReqBuilder(MavenArtifactNamespace.MAVEN_ARTIFACT_NAMESPACE)
.addAttribute(MavenArtifactNamespace.CAPABILITY_GROUP_ATTRIBUTE, project.getGroupId())
.addAttribute(MavenArtifactNamespace.MAVEN_ARTIFACT_NAMESPACE, project.getArtifactId())
@@ -82,6 +118,9 @@ public void execute() throws MojoExecutionException, MojoFailureException {
rb.addCapability(identity);
resourceGenerator.resource(rb.build());
getLog().info("Adding " + project.getId());
+ if (folder != null) {
+ FileUtils.copyFileToDirectory(file, folder);
+ }
} else {
getLog().info("Skip " + project.getId() + ": Not a bundle");
}
@@ -92,11 +131,22 @@ public void execute() throws MojoExecutionException, MojoFailureException {
}
}
try {
- File location = new File(destination, repositoryFileName);
- resourceGenerator.save(location);
Artifact artifact = project.getArtifact();
- artifact.setArtifactHandler(new DefaultArtifactHandler("xml"));
- artifact.setFile(location);
+ if (folder != null) {
+ File location = new File(folder, repositoryFileName);
+ resourceGenerator.save(location);
+ File destFile = new File(destination, project.getArtifactId() + "-" + folder.getName() + ".zip");
+ zipArchiver.addDirectory(folder);
+ zipArchiver.setDestFile(destFile);
+ zipArchiver.createArchive();
+ artifact.setFile(destFile);
+ artifact.setArtifactHandler(new DefaultArtifactHandler("zip"));
+ } else {
+ File location = new File(destination, repositoryFileName);
+ resourceGenerator.save(location);
+ artifact.setArtifactHandler(new DefaultArtifactHandler("xml"));
+ artifact.setFile(location);
+ }
} catch (IOException e) {
throw new MojoExecutionException("Could not write OSGi Repository!", e);
}
diff --git a/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/RepositoryLayout.java b/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/RepositoryLayout.java
new file mode 100644
index 0000000000..fe678ce47b
--- /dev/null
+++ b/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/RepositoryLayout.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Christoph Läubrich and others.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christoph Läubrich - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tycho.repository.plugin;
+
+public enum RepositoryLayout {
+ /**
+ * reference artifacts using mvn: protocol
+ */
+ maven,
+ /**
+ * references artifacts as local files and copy them into a folder
+ */
+ local;
+}
\ No newline at end of file
diff --git a/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageMavenLifecycleParticipant.java b/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/TychoRepositoryPluginMavenLifecycleParticipant.java
similarity index 92%
rename from tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageMavenLifecycleParticipant.java
rename to tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/TychoRepositoryPluginMavenLifecycleParticipant.java
index 324cdf3272..b3088291be 100644
--- a/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/PackageMavenLifecycleParticipant.java
+++ b/tycho-repository-plugin/src/main/java/org/eclipse/tycho/repository/plugin/TychoRepositoryPluginMavenLifecycleParticipant.java
@@ -23,7 +23,7 @@
import org.codehaus.plexus.component.annotations.Component;
@Component(role = AbstractMavenLifecycleParticipant.class)
-public class PackageMavenLifecycleParticipant extends AbstractMavenLifecycleParticipant {
+public class TychoRepositoryPluginMavenLifecycleParticipant extends AbstractMavenLifecycleParticipant {
@Override
public void afterProjectsRead(MavenSession session) throws MavenExecutionException {
@@ -40,7 +40,7 @@ private void addInterestingProjects(MavenProject project, List pro
if (other == project) {
continue;
}
- if (PackageMavenRepositoryMojo.isInteresting(other)) {
+ if (PackageRepositoryMojo.isInteresting(other)) {
Dependency dependency = new Dependency();
dependency.setGroupId(other.getGroupId());
dependency.setArtifactId(other.getArtifactId());
diff --git a/tycho-repository-plugin/src/main/resources/META-INF/plexus/components.xml b/tycho-repository-plugin/src/main/resources/META-INF/plexus/components.xml
index 7d4a3d00c1..cd2600c5ca 100644
--- a/tycho-repository-plugin/src/main/resources/META-INF/plexus/components.xml
+++ b/tycho-repository-plugin/src/main/resources/META-INF/plexus/components.xml
@@ -31,7 +31,7 @@
- org.eclipse.tycho:tycho-repository-plugin:${project.version}:package-maven-repository
+ org.eclipse.tycho:tycho-repository-plugin:${project.version}:package-repository