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: + * + */ + @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