From 39db718c3b10baf153351ed94bf2d45cce03b089 Mon Sep 17 00:00:00 2001 From: Jonathan Knight Date: Tue, 28 May 2024 16:24:03 +0300 Subject: [PATCH] Use Maven Resolver API v2 (#467) --- .../com/oracle/bedrock/maven/MavenTest.java | 1 - bedrock-runtime-maven/pom.xml | 8 +- .../java/com/oracle/bedrock/maven/Maven.java | 104 +++++++++++------- .../src/main/java/module-info.java | 3 +- .../bedrock/runtime/java/ClassPath.java | 21 ++++ pom.xml | 2 +- 6 files changed, 96 insertions(+), 43 deletions(-) diff --git a/bedrock-runtime-maven-tests/src/test/java/com/oracle/bedrock/maven/MavenTest.java b/bedrock-runtime-maven-tests/src/test/java/com/oracle/bedrock/maven/MavenTest.java index 6256ec74..1758aed2 100644 --- a/bedrock-runtime-maven-tests/src/test/java/com/oracle/bedrock/maven/MavenTest.java +++ b/bedrock-runtime-maven-tests/src/test/java/com/oracle/bedrock/maven/MavenTest.java @@ -31,7 +31,6 @@ import com.oracle.bedrock.runtime.console.CapturingApplicationConsole; import com.oracle.bedrock.runtime.java.JavaApplication; import com.oracle.bedrock.runtime.java.options.ClassName; -import com.oracle.bedrock.runtime.java.options.SystemProperty; import com.oracle.bedrock.runtime.options.Console; import org.junit.Test; diff --git a/bedrock-runtime-maven/pom.xml b/bedrock-runtime-maven/pom.xml index 627969e4..40ce2d22 100644 --- a/bedrock-runtime-maven/pom.xml +++ b/bedrock-runtime-maven/pom.xml @@ -60,7 +60,13 @@ org.apache.maven.resolver - maven-resolver-transport-http + maven-resolver-supplier-mvn3 + ${maven.resolver.version} + + + + org.apache.maven.resolver + maven-resolver-transport-jdk-11 ${maven.resolver.version} diff --git a/bedrock-runtime-maven/src/main/java/com/oracle/bedrock/maven/Maven.java b/bedrock-runtime-maven/src/main/java/com/oracle/bedrock/maven/Maven.java index a2479e8e..0c9ff6f2 100644 --- a/bedrock-runtime-maven/src/main/java/com/oracle/bedrock/maven/Maven.java +++ b/bedrock-runtime-maven/src/main/java/com/oracle/bedrock/maven/Maven.java @@ -35,7 +35,6 @@ import com.oracle.bedrock.runtime.java.ClassPath; import com.oracle.bedrock.runtime.java.JavaApplication; import com.oracle.bedrock.runtime.options.PlatformSeparators; -import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.apache.maven.settings.Repository; import org.apache.maven.settings.Settings; import org.apache.maven.settings.building.DefaultSettingsBuilderFactory; @@ -43,33 +42,35 @@ import org.apache.maven.settings.building.SettingsBuilder; import org.apache.maven.settings.building.SettingsBuildingException; import org.eclipse.aether.DefaultRepositoryCache; -import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositoryException; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; -import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyFilter; -import org.eclipse.aether.impl.DefaultServiceLocator; import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactDescriptorResult; +import org.eclipse.aether.resolution.ArtifactRequest; import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.aether.resolution.DependencyRequest; import org.eclipse.aether.resolution.VersionRangeRequest; import org.eclipse.aether.resolution.VersionRangeResult; -import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; +import org.eclipse.aether.spi.artifact.decorator.ArtifactDecorator; +import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory; import org.eclipse.aether.spi.connector.transport.TransporterFactory; -import org.eclipse.aether.transport.file.FileTransporterFactory; -import org.eclipse.aether.transport.http.HttpTransporterFactory; +import org.eclipse.aether.supplier.RepositorySystemSupplier; +import org.eclipse.aether.supplier.SessionBuilderSupplier; +import org.eclipse.aether.transport.jdk.JdkTransporterFactory; import org.eclipse.aether.util.artifact.JavaScopes; import org.eclipse.aether.util.filter.DependencyFilterUtils; import org.eclipse.aether.version.Version; import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -230,32 +231,44 @@ private Settings getSettings(OptionsByType optionsByType) */ private RepositorySystem newRepositorySystem() { - /* - * Aether's components implement org.eclipse.aether.spi.locator.Service to ease manual wiring and using the - * pre-populated DefaultServiceLocator, we only need to register the repository connector and transporter - * factories. - */ - DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); - - locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); - locator.addService(TransporterFactory.class, FileTransporterFactory.class); - locator.addService(TransporterFactory.class, HttpTransporterFactory.class); - - locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() - { - @Override - public void serviceCreationFailed(Class type, - Class impl, - Throwable exception) - { - exception.printStackTrace(); - } - }); - - return locator.getService(RepositorySystem.class); - } + return new RepositorySystemSupplier() { + @Override + protected Map createArtifactDecoratorFactories() { + Map result = super.createArtifactDecoratorFactories(); + result.put("color", new ArtifactDecoratorFactory() { + @Override + public ArtifactDecorator newInstance(RepositorySystemSession session) { + return new ArtifactDecorator() { + @Override + public Artifact decorateArtifact(ArtifactDescriptorResult artifactDescriptorResult) { + Map properties = new HashMap<>( + artifactDescriptorResult.getArtifact().getProperties()); + properties.put("color", "red"); + return artifactDescriptorResult.getArtifact().setProperties(properties); + } + }; + } + @Override + public float getPriority() { + return 0; + } + }); + return result; + } + + @Override + protected Map createTransporterFactories() { + Map result = super.createTransporterFactories(); + result.put( + JdkTransporterFactory.NAME, + new JdkTransporterFactory(getChecksumExtractor(), getPathProcessor())); + return result; + } + }.get(); + } + @SuppressWarnings("deprecation") @Override public void onLaunching(Platform platform, MetaClass metaClass, @@ -267,7 +280,7 @@ public void onLaunching(Platform platform, perform( (system, session, repositories, scope) -> { - // we only filter based on the scope + // we only filter based on the scope DependencyFilter filter = DependencyFilterUtils.classpathFilter(scope); // collect class paths for each resolved artifact @@ -275,6 +288,14 @@ public void onLaunching(Platform platform, for (Artifact artifact : artifacts.values()) { + ArtifactRequest artifactRequest = new ArtifactRequest(); + artifactRequest.setArtifact(artifact); + artifactRequest.setRepositories(repositories); + + ArtifactResult artifactResult = system.resolveArtifact(session, artifactRequest); + Artifact actualArtifact = artifactResult.getArtifact(); + artifactPaths.add(ClassPath.ofPath(actualArtifact.getPath())); + CollectRequest collectRequest = new CollectRequest(); collectRequest.setRoot(new Dependency(artifact, scope)); @@ -285,10 +306,10 @@ public void onLaunching(Platform platform, List artifactResults = system.resolveDependencies(session, dependencyRequest) .getArtifactResults(); - - for (ArtifactResult artifactResult : artifactResults) + //artifactPaths.add(ClassPath.ofPath(artifact.getPath())); + for (ArtifactResult dependencyResult : artifactResults) { - artifactPaths.add(ClassPath.ofFile(artifactResult.getArtifact().getFile())); + artifactPaths.add(ClassPath.ofPath(dependencyResult.getArtifact().getPath())); } } @@ -753,11 +774,11 @@ private void perform(RepositorySystemOperation operation, RepositorySystem system = newRepositorySystem(); // ----- establish the session for the repository system ----- - DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); + RepositorySystemSession.SessionBuilder sessionBuilder = new SessionBuilderSupplier(system).get(); - session.setOffline(isOffline == null ? false : isOffline); + sessionBuilder.setOffline(isOffline == null ? false : isOffline); - session.setCache(new DefaultRepositoryCache()); + sessionBuilder.setCache(new DefaultRepositoryCache()); // define the local repository File localRepositoryLocation = new File(System.getProperty("user.home") + separators.getFileSeparator() + ".m2" @@ -765,7 +786,12 @@ private void perform(RepositorySystemOperation operation, LocalRepository localRepo = new LocalRepository(localRepositoryLocation); - session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); + + sessionBuilder.withLocalRepositoryBaseDirectories(localRepositoryLocation.toPath()); + RepositorySystemSession.CloseableSession session = sessionBuilder.build(); + + + sessionBuilder.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); // ----- establish the remote repositories to use from the settings ----- diff --git a/bedrock-runtime-maven/src/main/java/module-info.java b/bedrock-runtime-maven/src/main/java/module-info.java index ab20949f..9c17165f 100644 --- a/bedrock-runtime-maven/src/main/java/module-info.java +++ b/bedrock-runtime-maven/src/main/java/module-info.java @@ -13,7 +13,8 @@ requires org.apache.maven.resolver.impl; requires org.apache.maven.resolver.spi; requires org.apache.maven.resolver.transport.file; - requires org.apache.maven.resolver.transport.http; + requires org.apache.maven.resolver.transport.jdk; requires org.apache.maven.resolver.util; requires maven.resolver.provider; +requires org.apache.maven.resolver.supplier; } \ No newline at end of file diff --git a/bedrock-runtime/src/main/java/com/oracle/bedrock/runtime/java/ClassPath.java b/bedrock-runtime/src/main/java/com/oracle/bedrock/runtime/java/ClassPath.java index f7c09fc7..80f7b277 100755 --- a/bedrock-runtime/src/main/java/com/oracle/bedrock/runtime/java/ClassPath.java +++ b/bedrock-runtime/src/main/java/com/oracle/bedrock/runtime/java/ClassPath.java @@ -40,6 +40,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; @@ -846,6 +847,26 @@ public static ClassPath ofFile(File file) } + /** + * Obtains a {@link ClassPath} containing only absolute path of the specified File + * + * @param path the Path to the artifact + * + * @return a {@link ClassPath} of a file + */ + public static ClassPath ofPath(Path path) + { + if (path == null) + { + throw new NullPointerException("Path must not be null"); + } + else + { + return new ClassPath(path.toString()); + } + } + + /** * Obtains Java System class-path. * diff --git a/pom.xml b/pom.xml index 241fdc42..ed929436 100644 --- a/pom.xml +++ b/pom.xml @@ -117,7 +117,7 @@ 8.2.1 - 1.9.20 + 2.0.0-alpha-11 5.0.0-M1 2.2 5.0.1