diff --git a/pom.xml b/pom.xml index 0d758190ed..9dc8d09a69 100644 --- a/pom.xml +++ b/pom.xml @@ -44,11 +44,9 @@ $ { jenkinsci/${project.artifactId} - 1.1.0 3.8.1 3.9.0 - 1.1.0 false @@ -67,64 +65,9 @@ 1.15 - org.apache.maven - maven-artifact - ${maven.version} - - - org.apache.maven - maven-core - ${maven.version} - - - org.apache.maven - maven-model - ${maven.version} - - - org.apache.maven - maven-plugin-api - ${maven.version} - - - org.apache.maven.shared - maven-shared-utils - 3.4.2 - - - org.codehaus.plexus - plexus-archiver - 4.7.1 - - - org.codehaus.plexus - plexus-component-annotations - 2.1.1 - - - org.codehaus.plexus - plexus-io - 3.4.1 - - - org.eclipse.aether - aether-api - ${aether.version} - - - org.eclipse.aether - aether-impl - ${aether.version} - - - org.eclipse.aether - aether-spi - ${aether.version} - - - org.eclipse.aether - aether-util - ${aether.version} + org.slf4j + slf4j-api + 2.0.7 @@ -171,11 +114,6 @@ maven-archiver 3.6.0 - - org.apache.maven.shared - maven-artifact-transfer - 0.13.1 - org.apache.maven.shared maven-dependency-tree @@ -220,22 +158,19 @@ org.apache.maven maven-artifact - provided - - - org.apache.maven - maven-builder-support ${maven.version} provided org.apache.maven maven-core + ${maven.version} provided org.apache.maven maven-model + ${maven.version} provided @@ -247,11 +182,6 @@ org.apache.maven maven-plugin-api - provided - - - org.apache.maven - maven-repository-metadata ${maven.version} provided @@ -261,18 +191,6 @@ ${maven.version} provided - - org.apache.maven - maven-settings - ${maven.version} - provided - - - org.apache.maven - maven-settings-builder - ${maven.version} - provided - org.apache.maven.plugin-tools maven-plugin-annotations @@ -308,26 +226,6 @@ - - maven-enforcer-plugin - - - display-info - - - - - commons-lang:commons-lang - org.apache.commons:commons-collections4 - org.apache.commons:commons-lang3 - org.slf4j:slf4j-api - - - - - - - org.apache.maven.plugins maven-invoker-plugin diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java index 9fba80ac6d..c4bd76f807 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java @@ -16,14 +16,10 @@ import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; import org.apache.maven.project.ProjectBuilder; -import org.apache.maven.project.ProjectBuildingRequest; -import org.apache.maven.shared.transfer.artifact.DefaultArtifactCoordinate; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; +import org.eclipse.aether.RepositorySystem; /** * Mojos that need to figure out the Jenkins version it's working with. @@ -62,7 +58,7 @@ public abstract class AbstractJenkinsMojo extends AbstractMojo { protected ArtifactFactory artifactFactory; @Component - protected ArtifactResolver artifactResolver; + protected RepositorySystem repositorySystem; @Component protected ProjectBuilder projectBuilder; @@ -127,30 +123,20 @@ protected JavaSpecificationVersion getMinimumJavaVersion() throws MojoExecutionE } private Artifact resolveJenkinsCore() throws MojoExecutionException { - DefaultArtifactCoordinate artifactCoordinate = new DefaultArtifactCoordinate(); + String groupId, artifactId; if (jenkinsCoreId != null) { String[] parts = jenkinsCoreId.split(":"); - artifactCoordinate.setGroupId(parts[0]); - artifactCoordinate.setArtifactId(parts[1]); + groupId = parts[0]; + artifactId = parts[1]; } else { - artifactCoordinate.setGroupId("org.jenkins-ci.main"); - artifactCoordinate.setArtifactId("jenkins-core"); - } - artifactCoordinate.setVersion(findJenkinsVersion()); - - try { - ProjectBuildingRequest buildingRequest = - new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); - buildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - return artifactResolver - .resolveArtifact(buildingRequest, artifactCoordinate) - .getArtifact(); - } catch (ArtifactResolverException e) { - throw new MojoExecutionException("Couldn't download artifact: ", e); + groupId = "org.jenkins-ci.main"; + artifactId = "jenkins-core"; } + Artifact artifact = artifactFactory.createArtifact(groupId, artifactId, findJenkinsVersion(), null, "jar"); + return MavenArtifact.resolveArtifact(artifact, project, session, repositorySystem); } protected MavenArtifact wrap(Artifact a) { - return new MavenArtifact(a, artifactResolver, artifactFactory, projectBuilder, session, project); + return new MavenArtifact(a, repositorySystem, artifactFactory, projectBuilder, session, project); } } diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/HplMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/HplMojo.java index ea0d1f0318..dc8e33208a 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/HplMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/HplMojo.java @@ -113,7 +113,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { * puts into WEB-INF/lib should be the same so that the plugins see consistent * environment. */ - private void buildLibraries(List paths) throws IOException { + private void buildLibraries(List paths) throws IOException, MojoExecutionException { Set artifacts = getProjectArtfacts(); // List up IDs of Jenkins plugin dependencies diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/MavenArtifact.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/MavenArtifact.java index 78e1af2dd8..3e289a17ac 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/MavenArtifact.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/MavenArtifact.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Objects; import java.util.jar.JarFile; +import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.handler.ArtifactHandler; @@ -13,15 +14,22 @@ import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectBuilder; import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectBuildingRequest; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactDescriptorException; +import org.eclipse.aether.resolution.ArtifactDescriptorRequest; +import org.eclipse.aether.resolution.ArtifactDescriptorResult; +import org.eclipse.aether.resolution.ArtifactRequest; +import org.eclipse.aether.resolution.ArtifactResolutionException; /** * {@link Artifact} is a bare data structure without any behavior and therefore @@ -35,19 +43,19 @@ public class MavenArtifact implements Comparable { public final ArtifactFactory artifactFactory; public final ProjectBuilder builder; public final Artifact artifact; - public final ArtifactResolver resolver; + public final RepositorySystem repositorySystem; public final MavenSession session; public final MavenProject project; public MavenArtifact( Artifact artifact, - ArtifactResolver resolver, + RepositorySystem repositorySystem, ArtifactFactory artifactFactory, ProjectBuilder builder, MavenSession session, MavenProject project) { this.artifact = artifact; - this.resolver = resolver; + this.repositorySystem = repositorySystem; this.artifactFactory = artifactFactory; this.builder = builder; this.session = Objects.requireNonNull(session); @@ -123,40 +131,65 @@ public String getType() { /** * Resolves to the jar file that contains the code of the plugin. */ - public File getFile() { + public File getFile() throws MojoExecutionException { if (artifact.getFile() == null) { + return resolveArtifact(artifact, project, session, repositorySystem).getFile(); + } + return artifact.getFile(); + } + + static Artifact resolveArtifact( + Artifact artifact, MavenProject project, MavenSession session, RepositorySystem repositorySystem) + throws MojoExecutionException { + ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); + buildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); + List remoteRepositories = RepositoryUtils.toRepos(buildingRequest.getRemoteRepositories()); + RepositorySystemSession repositorySession = buildingRequest.getRepositorySession(); + + // use descriptor to respect relocation + ArtifactDescriptorRequest descriptorRequest = + new ArtifactDescriptorRequest(RepositoryUtils.toArtifact(artifact), remoteRepositories, null); + + ArtifactDescriptorResult descriptorResult; + try { + descriptorResult = repositorySystem.readArtifactDescriptor(repositorySession, descriptorRequest); + } catch (ArtifactDescriptorException e) { + throw new MojoExecutionException("Failed to read artifact descriptor: " + artifact, e); + } + + ArtifactRequest request = new ArtifactRequest(descriptorResult.getArtifact(), remoteRepositories, null); + Artifact resolved; + try { + resolved = RepositoryUtils.toArtifact( + repositorySystem.resolveArtifact(repositorySession, request).getArtifact()); + } catch (ArtifactResolutionException e) { + throw new MojoExecutionException("Failed to resolve artifact: " + artifact, e); + } + + /* + * If the result is a directory rather than a file, we must be in a multi-module project + * where one plugin depends on another plugin in the same multi-module project. Try again + * without the workspace reader to force Maven to look for released artifacts rather than in + * the target/ directory of another module. + */ + if (resolved.getFile().isDirectory() + && buildingRequest.getRepositorySession() instanceof DefaultRepositorySystemSession) { + DefaultRepositorySystemSession oldRepositorySession = + (DefaultRepositorySystemSession) buildingRequest.getRepositorySession(); + DefaultRepositorySystemSession newRepositorySession = + new DefaultRepositorySystemSession(oldRepositorySession); + newRepositorySession.setWorkspaceReader(null); + newRepositorySession.setReadOnly(); try { - ProjectBuildingRequest buildingRequest = - new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); - buildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - File result = resolver.resolveArtifact(buildingRequest, artifact) - .getArtifact() - .getFile(); - /* - * If the result is a directory rather than a file, we must be in a multi-module - * project where one plugin depends on another plugin in the same multi-module - * project. Try again without the workspace reader to force Maven to look for - * released artifacts rather than in the target/ directory of another module. - */ - if (result.isDirectory() - && buildingRequest.getRepositorySession() instanceof DefaultRepositorySystemSession) { - DefaultRepositorySystemSession oldRepositorySession = - (DefaultRepositorySystemSession) buildingRequest.getRepositorySession(); - DefaultRepositorySystemSession newRepositorySession = - new DefaultRepositorySystemSession(oldRepositorySession); - newRepositorySession.setWorkspaceReader(null); - newRepositorySession.setReadOnly(); - buildingRequest.setRepositorySession(newRepositorySession); - result = resolver.resolveArtifact(buildingRequest, artifact) - .getArtifact() - .getFile(); - } - return result; - } catch (ArtifactResolverException e) { - throw new RuntimeException("Failed to resolve " + getId(), e); + resolved = RepositoryUtils.toArtifact(repositorySystem + .resolveArtifact(newRepositorySession, request) + .getArtifact()); + } catch (ArtifactResolutionException e) { + throw new MojoExecutionException("Failed to resolve artifact: " + artifact, e); } } - return artifact.getFile(); + + return resolved; } /** @@ -169,7 +202,7 @@ public MavenArtifact getHpi() throws IOException { artifact.getVersion(), Artifact.SCOPE_COMPILE, getResolvedType()); - return new MavenArtifact(a, resolver, artifactFactory, builder, session, project); + return new MavenArtifact(a, repositorySystem, artifactFactory, builder, session, project); } public List getDependencyTrail() { @@ -221,7 +254,7 @@ public ArtifactHandler getArtifactHandler() { } /** For a plugin artifact, unlike {@link #getArtifactId} this parses the plugin manifest. */ - public String getActualArtifactId() throws IOException { + public String getActualArtifactId() throws IOException, MojoExecutionException { File file = getFile(); if (file != null && file.isFile()) { try (JarFile jf = new JarFile(file)) { @@ -233,7 +266,7 @@ public String getActualArtifactId() throws IOException { } /** For a plugin artifact, unlike {@link #getVersion} this parses the plugin manifest. */ - public String getActualVersion() throws IOException { + public String getActualVersion() throws IOException, MojoExecutionException { File file = getFile(); if (file != null && file.isFile()) { try (JarFile jf = new JarFile(file)) { diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/RunMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/RunMojo.java index b177444003..8d32c63c31 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/RunMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/RunMojo.java @@ -61,16 +61,13 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.DefaultDependencyResolutionRequest; -import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.DependencyResolutionException; import org.apache.maven.project.DependencyResolutionRequest; import org.apache.maven.project.DependencyResolutionResult; import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectBuilder; -import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.project.ProjectDependenciesResolver; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; +import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.graph.DependencyFilter; import org.eclipse.aether.util.filter.ScopeDependencyFilter; import org.eclipse.jetty.http.HttpCompliance; @@ -147,7 +144,7 @@ public class RunMojo extends JettyRunWarMojo { protected File warSourceDirectory; @Component - protected ArtifactResolver artifactResolver; + protected RepositorySystem repositorySystem; @Component protected ArtifactFactory artifactFactory; @@ -317,17 +314,8 @@ public void execute() throws MojoExecutionException, MojoFailureException { .artifactIdIsNot("remoting"); // remoting moved to its own release cycle if (webAppFile == null) { - Artifact jenkinsWarArtifact = getJenkinsWarArtifact(); - try { - ProjectBuildingRequest buildingRequest = - new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); - buildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - jenkinsWarArtifact = artifactResolver - .resolveArtifact(buildingRequest, jenkinsWarArtifact) - .getArtifact(); - } catch (ArtifactResolverException x) { - throw new MojoExecutionException("Could not resolve " + jenkinsWarArtifact + ": " + x, x); - } + Artifact jenkinsWarArtifact = + MavenArtifact.resolveArtifact(getJenkinsWarArtifact(), project, session, repositorySystem); webAppFile = jenkinsWarArtifact.getFile(); if (webAppFile == null || !webAppFile.isFile()) { throw new MojoExecutionException("Could not find " + webAppFile + " from " + jenkinsWarArtifact); @@ -373,10 +361,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { // find corresponding .hpi file Artifact hpi = artifactFactory.createArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion(), null, "hpi"); - ProjectBuildingRequest buildingRequest = - new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); - buildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - hpi = artifactResolver.resolveArtifact(buildingRequest, hpi).getArtifact(); + hpi = MavenArtifact.resolveArtifact(hpi, project, session, repositorySystem); // check recursive dependency. this is a rare case that happens when we split out some things from the // core into a plugin @@ -401,7 +386,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { copyPlugin(hpi.getFile(), pluginsDir, actualArtifactId); } } - } catch (IOException | ArtifactResolverException e) { + } catch (IOException e) { throw new MojoExecutionException("Unable to copy dependency plugin", e); } @@ -772,7 +757,7 @@ public Set getProjectArtifacts() { } protected MavenArtifact wrap(Artifact a) { - return new MavenArtifact(a, artifactResolver, artifactFactory, projectBuilder, session, project); + return new MavenArtifact(a, repositorySystem, artifactFactory, projectBuilder, session, project); } protected Artifact getJenkinsWarArtifact() throws MojoExecutionException { diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/TestRuntimeMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/TestRuntimeMojo.java index d947b99720..59ab9b6149 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/TestRuntimeMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/TestRuntimeMojo.java @@ -18,10 +18,6 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.DefaultProjectBuildingRequest; -import org.apache.maven.project.ProjectBuildingRequest; -import org.apache.maven.shared.transfer.artifact.DefaultArtifactCoordinate; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; /** * Configure Surefire for the desired version of Java. @@ -73,22 +69,9 @@ private void setAddOpensProperty() throws MojoExecutionException { @NonNull private Artifact resolveJenkinsWar() throws MojoExecutionException { - DefaultArtifactCoordinate artifactCoordinate = new DefaultArtifactCoordinate(); - artifactCoordinate.setGroupId("org.jenkins-ci.main"); - artifactCoordinate.setArtifactId("jenkins-war"); - artifactCoordinate.setVersion(findJenkinsVersion()); - artifactCoordinate.setExtension("war"); - - try { - ProjectBuildingRequest buildingRequest = - new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); - buildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - return artifactResolver - .resolveArtifact(buildingRequest, artifactCoordinate) - .getArtifact(); - } catch (ArtifactResolverException e) { - throw new MojoExecutionException("Couldn't download artifact: ", e); - } + Artifact artifact = + artifactFactory.createArtifact("org.jenkins-ci.main", "jenkins-war", findJenkinsVersion(), null, "war"); + return MavenArtifact.resolveArtifact(artifact, project, session, repositorySystem); } @CheckForNull diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/WarMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/WarMojo.java index 1ec918d82a..15fe620b9d 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/WarMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/WarMojo.java @@ -12,11 +12,8 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; -import org.apache.maven.project.ProjectBuildingRequest; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Zip; import org.apache.tools.ant.types.ZipFileSet; @@ -90,10 +87,7 @@ public void execute() throws MojoExecutionException { // find corresponding .hpi file Artifact hpi = artifactFactory.createArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion(), null, "hpi"); - ProjectBuildingRequest buildingRequest = - new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); - buildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - hpi = artifactResolver.resolveArtifact(buildingRequest, hpi).getArtifact(); + hpi = MavenArtifact.resolveArtifact(hpi, project, session, repositorySystem); if (hpi.getFile().isDirectory()) { throw new UnsupportedOperationException( @@ -110,7 +104,7 @@ public void execute() throws MojoExecutionException { getLog().info("Generated " + outputFile); projectHelper.attachArtifact(getProject(), "war", outputFile); - } catch (IOException | ArtifactResolverException e) { + } catch (IOException e) { throw new MojoExecutionException("Failed to package war", e); } }