From 1212cc7e2861aa8e19cfe65bfecd7f74ea2a2ecd Mon Sep 17 00:00:00 2001 From: rfscholte Date: Wed, 20 Feb 2019 20:01:40 +0100 Subject: [PATCH] Require Maven 3.0 (drop Maven2 code) --- pom.xml | 44 ++++---- .../codehaus/mojo/exec/AbstractExecMojo.java | 35 +++--- .../org/codehaus/mojo/exec/ExecJavaMojo.java | 103 +++--------------- .../codehaus/mojo/exec/ExecJavaMojoTest.java | 42 ++++--- .../org/codehaus/mojo/exec/ExecMojoTest.java | 42 ++++--- 5 files changed, 110 insertions(+), 156 deletions(-) diff --git a/pom.xml b/pom.xml index dde67cc8..f5116770 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ exec-maven-plugin - 1.6.1-SNAPSHOT + 3.0.0-SNAPSHOT maven-plugin Exec Maven Plugin @@ -107,16 +107,6 @@ - - org.apache.maven - maven-toolchain - ${mavenVersion} - - - org.apache.maven - maven-project - ${mavenVersion} - org.apache.maven maven-model @@ -127,11 +117,6 @@ maven-artifact ${mavenVersion} - - org.apache.maven - maven-artifact-manager - ${mavenVersion} - org.apache.maven maven-core @@ -160,7 +145,7 @@ org.codehaus.plexus plexus-component-annotations 1.6 - provided + true @@ -168,11 +153,23 @@ commons-exec 1.3 - + org.apache.maven.shared + maven-artifact-transfer + 0.10.1 + + + + org.apache.maven.plugin-testing maven-plugin-testing-harness - 1.1 + 2.1 + test + + + org.apache.maven + maven-compat + ${mavenVersion} test @@ -181,11 +178,16 @@ 1.21 test - + + org.mockito + mockito-core + 1.9.0 + test + - 2.2.1 + 3.0 diff --git a/src/main/java/org/codehaus/mojo/exec/AbstractExecMojo.java b/src/main/java/org/codehaus/mojo/exec/AbstractExecMojo.java index ab600325..67e526bb 100644 --- a/src/main/java/org/codehaus/mojo/exec/AbstractExecMojo.java +++ b/src/main/java/org/codehaus/mojo/exec/AbstractExecMojo.java @@ -25,17 +25,16 @@ import java.util.List; import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Resource; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.metadata.ArtifactMetadataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.MavenProjectBuilder; +import org.apache.maven.project.ProjectBuilder; +import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver; import org.codehaus.plexus.util.cli.CommandLineUtils; /** @@ -53,25 +52,19 @@ public abstract class AbstractExecMojo */ @Parameter( defaultValue = "${project}", readonly = true ) protected MavenProject project; + + @Parameter( defaultValue = "${session}", readonly = true, required = true ) + private MavenSession session; @Component private ArtifactResolver artifactResolver; @Component - private ArtifactFactory artifactFactory; - - @Component - private MavenProjectBuilder projectBuilder; - - @Component - private ArtifactMetadataSource metadataSource; - - @Parameter( readonly = true, required = true, defaultValue = "${localRepository}" ) - private ArtifactRepository localRepository; - - @Parameter( readonly = true, required = true, defaultValue = "${project.remoteArtifactRepositories}" ) - private List remoteRepositories; + private ProjectBuilder projectBuilder; + @Parameter( defaultValue = "${plugin}", readonly = true ) // Maven 3 only + private PluginDescriptor plugin; + @Parameter( readonly = true, defaultValue = "${plugin.artifacts}" ) private List pluginDependencies; @@ -152,7 +145,6 @@ public abstract class AbstractExecMojo * @param artifacts the list where to collect the scope specific artifacts * @param theClasspathFiles the list where to collect the scope specific output directories */ - @SuppressWarnings( "unchecked" ) protected void collectProjectArtifactsAndClasspath( List artifacts, List theClasspathFiles ) { if ( addResourcesToClasspath ) @@ -265,6 +257,11 @@ protected boolean isSkip() return skip; } + protected final MavenSession getSession() + { + return session; + } + /** * Examine the plugin dependencies to find the executable artifact. * diff --git a/src/main/java/org/codehaus/mojo/exec/ExecJavaMojo.java b/src/main/java/org/codehaus/mojo/exec/ExecJavaMojo.java index f0d68aca..fe77c1ec 100644 --- a/src/main/java/org/codehaus/mojo/exec/ExecJavaMojo.java +++ b/src/main/java/org/codehaus/mojo/exec/ExecJavaMojo.java @@ -1,50 +1,23 @@ package org.codehaus.mojo.exec; -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.io.File; import java.io.IOException; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Properties; import java.util.Set; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.metadata.ArtifactMetadataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactResolutionResult; -import org.apache.maven.artifact.resolver.ArtifactResolver; -import org.apache.maven.model.Dependency; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; @@ -52,8 +25,11 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.MavenProjectBuilder; -import org.apache.maven.project.artifact.MavenMetadataSource; +import org.apache.maven.project.ProjectBuilder; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult; +import org.apache.maven.shared.transfer.dependencies.DefaultDependableCoordinate; +import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver; /** * Executes the supplied java class in the current VM with the enclosing project's dependencies as classpath. @@ -66,31 +42,14 @@ public class ExecJavaMojo extends AbstractExecMojo { @Component - private ArtifactResolver artifactResolver; - - @Component - private ArtifactFactory artifactFactory; - - @Component - private ArtifactMetadataSource metadataSource; + private DependencyResolver dependencyResolver; - /** - * @since 1.0 - */ - @Parameter( readonly = true, required = true, defaultValue = "${localRepository}" ) - private ArtifactRepository localRepository; - - /** - * @since 1.1-beta-1 - */ - @Parameter( readonly = true, required = true, defaultValue = "${project.remoteArtifactRepositories}" ) - private List remoteRepositories; /** * @since 1.0 */ @Component - private MavenProjectBuilder projectBuilder; + private ProjectBuilder projectBuilder; /** * @since 1.1-beta-1 @@ -645,8 +604,7 @@ private Set determineRelevantPluginDependencies() { getLog().debug( "Selected plugin Dependencies will be included." ); Artifact executableArtifact = this.findExecutableArtifact(); - Artifact executablePomArtifact = this.getExecutablePomArtifact( executableArtifact ); - relevantDependencies = this.resolveExecutableDependencies( executablePomArtifact ); + relevantDependencies = this.resolveExecutableDependencies( executableArtifact ); } } else @@ -657,19 +615,6 @@ private Set determineRelevantPluginDependencies() return relevantDependencies; } - /** - * Get the artifact which refers to the POM of the executable artifact. - * - * @param executableArtifact this artifact refers to the actual assembly. - * @return an artifact which refers to the POM of the executable artifact. - */ - private Artifact getExecutablePomArtifact( Artifact executableArtifact ) - { - return this.artifactFactory.createBuildArtifact( executableArtifact.getGroupId(), - executableArtifact.getArtifactId(), - executableArtifact.getVersion(), "pom" ); - } - /** * Resolve the executable dependencies for the specified project * @@ -681,30 +626,18 @@ private Set resolveExecutableDependencies( Artifact executablePomArtif throws MojoExecutionException { - Set executableDependencies; + Set executableDependencies = new LinkedHashSet<>(); try { + ProjectBuildingRequest buildingRequest = getSession().getProjectBuildingRequest(); + MavenProject executableProject = - this.projectBuilder.buildFromRepository( executablePomArtifact, this.remoteRepositories, - this.localRepository ); - - // get all of the dependencies for the executable project - List dependencies = executableProject.getDependencies(); - - // make Artifacts of all the dependencies - Set dependencyArtifacts = - MavenMetadataSource.createArtifacts( this.artifactFactory, dependencies, null, null, null ); - - // not forgetting the Artifact of the project itself - dependencyArtifacts.add( executableProject.getArtifact() ); - - // resolve all dependencies transitively to obtain a comprehensive list of assemblies - ArtifactResolutionResult result = - artifactResolver.resolveTransitively( dependencyArtifacts, executablePomArtifact, - Collections.emptyMap(), this.localRepository, - this.remoteRepositories, metadataSource, null, - Collections.emptyList() ); - executableDependencies = result.getArtifacts(); + this.projectBuilder.build( executablePomArtifact, buildingRequest ).getProject(); + + for ( ArtifactResult artifactResult : dependencyResolver.resolveDependencies( buildingRequest, executableProject.getModel(), null ) ) + { + executableDependencies.add( artifactResult.getArtifact() ); + } } catch ( Exception ex ) { diff --git a/src/test/java/org/codehaus/mojo/exec/ExecJavaMojoTest.java b/src/test/java/org/codehaus/mojo/exec/ExecJavaMojoTest.java index b7ff29db..f8ed07b0 100644 --- a/src/test/java/org/codehaus/mojo/exec/ExecJavaMojoTest.java +++ b/src/test/java/org/codehaus/mojo/exec/ExecJavaMojoTest.java @@ -15,23 +15,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.File; import java.io.IOException; import java.io.PrintStream; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.DefaultArtifactRepository; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.execution.MavenSession; import org.apache.maven.monitor.logging.DefaultLog; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.MavenProjectBuilder; +import org.apache.maven.project.ProjectBuilder; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.repository.internal.MavenRepositorySystemSession; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.console.ConsoleLogger; import org.codehaus.plexus.util.StringOutputStream; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager; /** * @author Jerome Lacoste @@ -40,6 +45,10 @@ public class ExecJavaMojoTest extends AbstractMojoTestCase { + @Mock + private MavenSession session; + + private static final File LOCAL_REPO = new File( "src/test/repository" ); /* * This one won't work yet public void xxtestSimpleRunPropertiesAndArguments() throws MojoExecutionException, @@ -277,18 +286,19 @@ private String execute( File pom, String goal ) private void setUpProject( File pomFile, AbstractMojo mojo ) throws Exception { - MavenProjectBuilder builder = (MavenProjectBuilder) lookup( MavenProjectBuilder.ROLE ); - - ArtifactRepositoryLayout localRepositoryLayout = - (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" ); - - String path = "src/test/repository"; - - ArtifactRepository localRepository = - new DefaultArtifactRepository( "local", "file://" + new File( path ).getAbsolutePath(), - localRepositoryLayout ); - - MavenProject project = builder.buildWithDependencies( pomFile, localRepository, null ); + super.setUp(); + + MockitoAnnotations.initMocks( this ); + + ProjectBuildingRequest buildingRequest = mock( ProjectBuildingRequest.class ); + when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest ); + MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession(); + repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) ); + when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession ); + + ProjectBuilder builder = lookup( ProjectBuilder.class ); + + MavenProject project = builder.build( pomFile, buildingRequest ).getProject(); // this gets the classes for these tests of this mojo (exec plugin) onto the project classpath for the test project.getBuild().setOutputDirectory( new File( "target/test-classes" ).getAbsolutePath() ); setVariableValueToObject( mojo, "project", project ); diff --git a/src/test/java/org/codehaus/mojo/exec/ExecMojoTest.java b/src/test/java/org/codehaus/mojo/exec/ExecMojoTest.java index 79286fea..e588c0af 100644 --- a/src/test/java/org/codehaus/mojo/exec/ExecMojoTest.java +++ b/src/test/java/org/codehaus/mojo/exec/ExecMojoTest.java @@ -1,5 +1,8 @@ package org.codehaus.mojo.exec; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /* * Copyright 2005 The Codehaus. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this * file except in compliance with the License. You may obtain a copy of the License at @@ -24,18 +27,21 @@ import org.apache.commons.exec.ExecuteException; import org.apache.commons.exec.Executor; import org.apache.commons.exec.OS; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.DefaultArtifactRepository; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.execution.MavenSession; import org.apache.maven.monitor.logging.DefaultLog; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.logging.SystemStreamLog; import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.MavenProjectBuilder; +import org.apache.maven.project.ProjectBuilder; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.repository.internal.MavenRepositorySystemSession; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.console.ConsoleLogger; import org.codehaus.plexus.util.StringOutputStream; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager; /** * @author Jerome Lacoste @@ -44,6 +50,11 @@ public class ExecMojoTest extends AbstractMojoTestCase { + @Mock + private MavenSession session; + + private static final File LOCAL_REPO = new File( "src/test/repository" ); + /* * Finding a file actually on disk of the test system makes some of the tests fail. * Hence a purely random UUID is used to prevent this situation. @@ -233,20 +244,21 @@ protected String execute( File pom, String goal ) private void setUpProject( File pomFile, ExecMojo mojo ) throws Exception { - MavenProjectBuilder builder = (MavenProjectBuilder) lookup( MavenProjectBuilder.ROLE ); - - ArtifactRepositoryLayout localRepositoryLayout = - (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" ); - - String path = "src/test/repository"; - - ArtifactRepository localRepository = - new DefaultArtifactRepository( "local", "file://" + new File( path ).getAbsolutePath(), - localRepositoryLayout ); + super.setUp(); + + MockitoAnnotations.initMocks( this ); + + ProjectBuildingRequest buildingRequest = mock( ProjectBuildingRequest.class ); + when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest ); + MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession(); + repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) ); + when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession ); + + ProjectBuilder builder = lookup( ProjectBuilder.class ); mojo.setBasedir( File.createTempFile( "mvn-temp", "txt" ).getParentFile() ); - MavenProject project = builder.buildWithDependencies( pomFile, localRepository, null ); + MavenProject project = builder.build( pomFile, buildingRequest ).getProject(); // this gets the classes for these tests of this mojo (exec plugin) onto the project classpath for the test project.getBuild().setOutputDirectory( new File( "target/test-classes" ).getAbsolutePath() );