From 4306c4d762e59fcb54954b32cf68917825fffc74 Mon Sep 17 00:00:00 2001 From: Hannes Wellmann Date: Sun, 23 Feb 2025 09:34:02 +0100 Subject: [PATCH 1/2] [TP] Update to Archetype 3.3.1 and unify archetypes OSGi metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adapt to API changes in archetype-common - Updating to Archetype 3.3. allows to remove the 'maven-artifact-transfer' dependency. Co-authored-by: Christoph Läubrich --- m2e-core-tests | 2 +- org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF | 15 +++-- .../archetype/ArchetypeCatalogFactory.java | 49 ++++++++------- .../internal/archetype/ArchetypePlugin.java | 32 +++++----- org.eclipse.m2e.feature/feature.xml | 4 -- target-platform/target-platform.target | 59 ++++++++----------- 6 files changed, 73 insertions(+), 88 deletions(-) diff --git a/m2e-core-tests b/m2e-core-tests index c153faa8aa..da85ee3a2e 160000 --- a/m2e-core-tests +++ b/m2e-core-tests @@ -1 +1 @@ -Subproject commit c153faa8aa9286f51fa35b7123718a96fc3a7bd5 +Subproject commit da85ee3a2ebb7f3ab6de48da8c5cd11539daef68 diff --git a/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF b/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF index 5abf9d3ddf..c0ce5e4ebb 100644 --- a/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF @@ -43,13 +43,13 @@ Require-Bundle: org.eclipse.m2e.core;bundle-version="[2.0.0,3.0.0)", org.eclipse.ui, org.eclipse.ui.navigator, org.eclipse.debug.ui -Import-Package: org.apache.maven.archetype.catalog;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.catalog.io.xpp3;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.common;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.exception;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.metadata;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.source;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.shared.transfer.artifact;provider=m2e;version="[0.13.1,1.0.0)", +Import-Package: org.apache.maven.archetype.catalog;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.catalog.io.xpp3;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.common;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.downloader;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.exception;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.metadata;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.source;provider=m2e;version="[3.3.0,4.0.0)", org.eclipse.compare.rangedifferencer, org.eclipse.ltk.core.refactoring, org.slf4j;version="[1.7.0,3.0.0)" @@ -57,4 +57,3 @@ Service-Component: OSGI-INF/component.xml, OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypeGenerator.xml, OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin.xml Automatic-Module-Name: org.eclipse.m2e.core.ui - diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java index 41de8cd4b6..e2d8c0114f 100644 --- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java +++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java @@ -13,6 +13,7 @@ package org.eclipse.m2e.core.ui.internal.archetype; +import java.io.File; import java.io.InputStream; import java.net.URI; import java.net.URL; @@ -24,6 +25,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.NoLocalRepositoryManagerException; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Status; import org.eclipse.osgi.util.NLS; @@ -34,12 +40,8 @@ import org.apache.maven.archetype.source.ArchetypeDataSource; import org.apache.maven.archetype.source.ArchetypeDataSourceException; import org.apache.maven.archetype.source.RemoteCatalogArchetypeDataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.MavenArtifactRepository; -import org.apache.maven.project.ProjectBuildingRequest; import org.eclipse.m2e.core.embedder.IMaven; -import org.eclipse.m2e.core.embedder.IMavenExecutionContext; import org.eclipse.m2e.core.internal.Messages; @@ -111,7 +113,7 @@ public static class InternalCatalogFactory extends ArchetypeCatalogFactory { @Override public ArchetypeCatalog getArchetypeCatalog() { try { - return source.getArchetypeCatalog(null); + return source.getArchetypeCatalog(null, null); } catch(ArchetypeDataSourceException e) { return new ArchetypeCatalog(); } @@ -137,9 +139,8 @@ public static class DefaultLocalCatalogFactory extends ArchetypeCatalogFactory { @Override public ArchetypeCatalog getArchetypeCatalog() throws CoreException { return maven.createExecutionContext().execute((ctx, m) -> { - ProjectBuildingRequest buildingRequest = ctx.newProjectBuildingRequest(); try { - return source.getArchetypeCatalog(buildingRequest); + return source.getArchetypeCatalog(ctx.getRepositorySession(), ArchetypePlugin.getRemoteRepositories(ctx)); } catch(ArchetypeDataSourceException e) { return new ArchetypeCatalog(); } @@ -172,16 +173,15 @@ public ArchetypeCatalog getArchetypeCatalog() throws CoreException { ArchetypeCatalog catalog = getEmbeddedCatalog(); if(catalog == null) { //local but not embedded catalog - IMavenExecutionContext context = maven.createExecutionContext(); - ArtifactRepository localRepository = new MavenArtifactRepository(); - localRepository.setUrl(getLocalRepositoryURL()); - context.getExecutionRequest().setLocalRepository(localRepository); - return context.execute((ctx, m) -> { - ProjectBuildingRequest buildingRequest = ctx.newProjectBuildingRequest(); - buildingRequest.setLocalRepository(localRepository); + File localRepositoryPath = getLocalRepositoryPath(); + return maven.createExecutionContext().execute((ctx, m) -> { try { - return source.getArchetypeCatalog(buildingRequest); - } catch(ArchetypeDataSourceException e) { + var managerFactory = ctx.getComponentLookup().lookup(LocalRepositoryManagerFactory.class); + DefaultRepositorySystemSession session = new DefaultRepositorySystemSession(ctx.getRepositorySession()); + session.setLocalRepositoryManager( + managerFactory.newInstance(session, new LocalRepository(localRepositoryPath))); + return source.getArchetypeCatalog(session, List.of()); + } catch(ArchetypeDataSourceException | NoLocalRepositoryManagerException e) { return new ArchetypeCatalog(); } }, null); @@ -189,7 +189,7 @@ public ArchetypeCatalog getArchetypeCatalog() throws CoreException { return catalog; } - private String getLocalRepositoryURL() { + private File getLocalRepositoryPath() { Path path; try { // First try to use the id as a path, then as a URI else as it is path = Path.of(getId()); @@ -197,14 +197,14 @@ private String getLocalRepositoryURL() { try { path = Path.of(new URI(getId())); } catch(Exception e2) { - return getId(); + return new File(getId()); } } path = path.toAbsolutePath(); if(Files.isRegularFile(path)) { path = path.getParent(); } - return path.toUri().toString(); + return path.toFile(); } private ArchetypeCatalog getEmbeddedCatalog() throws CoreException { @@ -281,13 +281,12 @@ public ArchetypeCatalog getArchetypeCatalog() throws CoreException { final String remoteUrl = url; ArchetypeCatalog catalog = maven.createExecutionContext().execute((ctx, m) -> { - ProjectBuildingRequest buildingRequest = ctx.newProjectBuildingRequest(); try { - ArtifactRepository archeTypeRepo = new MavenArtifactRepository(); - archeTypeRepo.setUrl(remoteUrl); - archeTypeRepo.setId(RemoteCatalogArchetypeDataSource.ARCHETYPE_REPOSITORY_ID); - buildingRequest.getRemoteRepositories().add(archeTypeRepo); - return source.getArchetypeCatalog(buildingRequest); + RemoteRepository archetypeRepo = new RemoteRepository.Builder( + RemoteCatalogArchetypeDataSource.ARCHETYPE_REPOSITORY_ID, "", remoteUrl).build(); + List remoteRepositories = new ArrayList<>(ArchetypePlugin.getRemoteRepositories(ctx)); + remoteRepositories.add(0, archetypeRepo); + return source.getArchetypeCatalog(ctx.getRepositorySession(), remoteRepositories); } catch(ArchetypeDataSourceException e) { return new ArchetypeCatalog(); } diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java index 24a349d31e..c8b055eaab 100644 --- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java +++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java @@ -36,6 +36,7 @@ import com.google.inject.AbstractModule; import com.google.inject.Module; +import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -50,6 +51,7 @@ import org.codehaus.plexus.classworlds.ClassWorld; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.apache.maven.RepositoryUtils; import org.apache.maven.archetype.catalog.Archetype; import org.apache.maven.archetype.common.ArchetypeArtifactManager; import org.apache.maven.archetype.exception.UnknownArchetype; @@ -57,10 +59,9 @@ import org.apache.maven.archetype.metadata.RequiredProperty; import org.apache.maven.archetype.source.ArchetypeDataSource; import org.apache.maven.archetype.source.ArchetypeDataSourceException; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.project.ProjectBuildingRequest; import org.eclipse.m2e.core.embedder.IMaven; +import org.eclipse.m2e.core.embedder.IMavenExecutionContext; import org.eclipse.m2e.core.internal.MavenPluginActivator; import org.eclipse.m2e.core.project.IArchetype; import org.eclipse.m2e.core.ui.internal.M2EUIPluginActivator; @@ -219,20 +220,16 @@ public List getRequiredProperties(IArchetype archetype, IProgr final String artifactId = archetype.getArtifactId(); final String version = archetype.getVersion(); - final List repositories = new ArrayList<>(maven.getArtifactRepositories()); - return maven.createExecutionContext().execute((context, monitor1) -> { - ArtifactRepository localRepository = context.getLocalRepository(); - if(archetypeArtifactManager.isFileSetArchetype(groupId, artifactId, version, null, localRepository, repositories, - context.newProjectBuildingRequest())) { - ArchetypeDescriptor descriptor; - try { - descriptor = archetypeArtifactManager.getFileSetArchetypeDescriptor(groupId, artifactId, version, null, - localRepository, repositories, context.newProjectBuildingRequest()); - } catch(UnknownArchetype ex) { - throw new CoreException(Status.error("UnknownArchetype", ex)); + try { + File archetypeFile = archetypeArtifactManager.getArchetypeFile(groupId, artifactId, version, + getRemoteRepositories(context), context.getRepositorySession()); + if(archetypeArtifactManager.isFileSetArchetype(archetypeFile)) { + ArchetypeDescriptor descriptor = archetypeArtifactManager.getFileSetArchetypeDescriptor(archetypeFile); + return descriptor.getRequiredProperties(); } - return descriptor.getRequiredProperties(); + } catch(UnknownArchetype ex) { + throw new CoreException(Status.error("UnknownArchetype", ex)); } return null; }, monitor); @@ -240,15 +237,16 @@ public List getRequiredProperties(IArchetype archetype, IProgr public void updateLocalCatalog(Archetype archetype) throws CoreException { maven.createExecutionContext().execute((ctx, m) -> { - ProjectBuildingRequest request = ctx.newProjectBuildingRequest(); try { ArchetypeDataSource source = archetypeDataSourceMap.get("catalog"); - - source.updateCatalog(request, archetype); + source.updateCatalog(ctx.getRepositorySession(), archetype); } catch(ArchetypeDataSourceException e) { } return null; }, null); } + static List getRemoteRepositories(IMavenExecutionContext ctx) throws CoreException { + return RepositoryUtils.toRepos(ctx.getExecutionRequest().getRemoteRepositories()); + } } diff --git a/org.eclipse.m2e.feature/feature.xml b/org.eclipse.m2e.feature/feature.xml index 09c14c7971..8a7ad86a36 100644 --- a/org.eclipse.m2e.feature/feature.xml +++ b/org.eclipse.m2e.feature/feature.xml @@ -34,10 +34,6 @@ id="org.eclipse.m2e.archetype.descriptor" version="0.0.0"/> - - diff --git a/target-platform/target-platform.target b/target-platform/target-platform.target index 0fdd2016af..70d9b3a62e 100644 --- a/target-platform/target-platform.target +++ b/target-platform/target-platform.target @@ -133,60 +133,53 @@ - + org.apache.maven.archetype archetype-common - 3.2.1 + 3.3.1 jar - - - - - org.apache.maven.archetype archetype-catalog - 3.2.1 + 3.3.1 jar org.apache.maven.archetype archetype-descriptor - 3.2.1 - jar - - - org.apache.maven.shared - maven-artifact-transfer - 0.13.1 + 3.3.1 jar From 658dfc600a536fddd52418a8798e40b43e5b6dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Sun, 2 Mar 2025 09:20:14 +0100 Subject: [PATCH 2/2] Use Sisu/Guice directly for archetype component lookup to replace plexus container. Co-authored-by: Hannes Wellmann --- .../internal/archetype/ArchetypePlugin.java | 57 ++++++++++++------- org.eclipse.m2e.maven.runtime/pom.xml | 10 ++-- pom.xml | 2 +- 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java index c8b055eaab..429bf279b2 100644 --- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java +++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.stream.Collectors; +import org.osgi.framework.FrameworkUtil; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -34,22 +35,28 @@ import org.slf4j.LoggerFactory; import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Key; import com.google.inject.Module; +import com.google.inject.TypeLiteral; +import com.google.inject.util.Modules; +import com.google.inject.util.Types; +import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; +import org.eclipse.sisu.space.BeanScanning; +import org.eclipse.sisu.space.BundleClassSpace; +import org.eclipse.sisu.space.ClassSpace; +import org.eclipse.sisu.space.SpaceModule; +import org.eclipse.sisu.wire.WireModule; -import org.codehaus.plexus.ContainerConfiguration; -import org.codehaus.plexus.DefaultContainerConfiguration; -import org.codehaus.plexus.DefaultPlexusContainer; -import org.codehaus.plexus.PlexusConstants; -import org.codehaus.plexus.PlexusContainerException; -import org.codehaus.plexus.classworlds.ClassWorld; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.codehaus.plexus.logging.LogEnabled; import org.apache.maven.RepositoryUtils; import org.apache.maven.archetype.catalog.Archetype; @@ -59,6 +66,7 @@ import org.apache.maven.archetype.metadata.RequiredProperty; import org.apache.maven.archetype.source.ArchetypeDataSource; import org.apache.maven.archetype.source.ArchetypeDataSourceException; +import org.apache.maven.cli.logging.Slf4jLogger; import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.embedder.IMavenExecutionContext; @@ -95,8 +103,6 @@ public class ArchetypePlugin { private Map archetypeDataSourceMap; - private DefaultPlexusContainer container; - public ArchetypePlugin() { this.configFile = new File(MavenPluginActivator.getDefault().getStateLocation().toFile(), M2EUIPluginActivator.PREFS_ARCHETYPES); @@ -104,21 +110,33 @@ public ArchetypePlugin() { } @Activate - void activate() throws PlexusContainerException, ComponentLookupException { - final Module logginModule = new AbstractModule() { + void activate() { + Module localBindings = new AbstractModule() { @Override protected void configure() { bind(ILoggerFactory.class).toInstance(LoggerFactory.getILoggerFactory()); + try { + bind(RepositorySystem.class).toInstance(MavenPluginActivator.getDefault().getRepositorySystem()); + } catch(CoreException ex) { + ex.printStackTrace(); + } } }; - final ContainerConfiguration cc = new DefaultContainerConfiguration() // - .setClassWorld(new ClassWorld("plexus.core", ArchetypeArtifactManager.class.getClassLoader())) //$NON-NLS-1$ - .setClassPathScanning(PlexusConstants.SCANNING_INDEX) // - .setAutoWiring(true) // - .setName("plexus"); //$NON-NLS-1$ - container = new DefaultPlexusContainer(cc, logginModule); - archetypeArtifactManager = container.lookup(ArchetypeArtifactManager.class); - archetypeDataSourceMap = container.lookupMap(ArchetypeDataSource.class); + ClassSpace space = new BundleClassSpace(FrameworkUtil.getBundle(ArchetypeArtifactManager.class)); + WireModule wireModule = new WireModule(new SpaceModule(space, BeanScanning.INDEX)); + Injector injector = Guice.createInjector(Modules.override(wireModule).with(localBindings)); + @SuppressWarnings("unchecked") + TypeLiteral> mapOfDataSourcesType = (TypeLiteral>) TypeLiteral + .get(Types.mapOf(String.class, ArchetypeDataSource.class)); + archetypeArtifactManager = injector.getInstance(ArchetypeArtifactManager.class); + archetypeDataSourceMap = injector.getInstance(Key.get(mapOfDataSourcesType)); + + if(archetypeArtifactManager instanceof LogEnabled logEnabled) { + logEnabled.enableLogging(new Slf4jLogger(LoggerFactory.getLogger(archetypeArtifactManager.getClass()))); + } + archetypeDataSourceMap.values().stream().filter(LogEnabled.class::isInstance).map(LogEnabled.class::cast) + .forEach(d -> d.enableLogging(new Slf4jLogger(LoggerFactory.getLogger(d.getClass())))); + addArchetypeCatalogFactory( new ArchetypeCatalogFactory.InternalCatalogFactory(archetypeDataSourceMap.get("internal-catalog"))); addArchetypeCatalogFactory( @@ -136,7 +154,6 @@ protected void configure() { @Deactivate void shutdown() throws IOException { saveCatalogs(); - container.dispose(); } public LocalCatalogFactory newLocalCatalogFactory(String path, String description, boolean editable, diff --git a/org.eclipse.m2e.maven.runtime/pom.xml b/org.eclipse.m2e.maven.runtime/pom.xml index 8c9c800819..7878d88766 100644 --- a/org.eclipse.m2e.maven.runtime/pom.xml +++ b/org.eclipse.m2e.maven.runtime/pom.xml @@ -21,7 +21,7 @@ org.eclipse.m2e.maven.runtime - 3.9.900-SNAPSHOT + 3.9.901-SNAPSHOT jar M2E Embedded Maven Runtime (includes Incubating components) @@ -140,7 +140,7 @@ org.slf4j slf4j-api - 2.0.16 + 2.0.17 provided @@ -202,8 +202,10 @@ org.slf4j.*;version="[1.7.31,3.0.0)",\ javax.inject;version="[1.0.0,2.0.0)",\ javax.annotation;version="[1.2.0,2.0.0)", \ - org.apache.commons.cli;version="[1.4.0,2.0.0)", \ - org.apache.commons.codec* + org.apache.commons.cli;version="[1.4.0,2.0.0)",\ + org.apache.commons.codec*,\ + org.osgi.*,\ + Require-Bundle: \ com.google.guava;bundle-version="32.2.1" diff --git a/pom.xml b/pom.xml index 3ffe83e7c3..e44d1cb5e5 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ org.eclipse.m2e org.eclipse.m2e.maven.runtime - 3.9.900-SNAPSHOT + 3.9.901-SNAPSHOT