diff --git a/maven-compat/pom.xml b/maven-compat/pom.xml
index 4f79ac828cda..ed7bce84d794 100644
--- a/maven-compat/pom.xml
+++ b/maven-compat/pom.xml
@@ -99,6 +99,11 @@ under the License.
wagon-provider-api
+
+ org.mockito
+ mockito-core
+ test
+
org.apache.maven.wagon
wagon-file
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java b/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java
index f929f4801b8a..ed0a43cf78f6 100644
--- a/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java
@@ -24,8 +24,12 @@
import org.apache.maven.artifact.AbstractArtifactComponentTestCase;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.session.scope.internal.SessionScope;
import org.codehaus.plexus.util.FileUtils;
+import static org.mockito.Mockito.mock;
+
/**
* @author Jason van Zyl
*/
@@ -34,12 +38,16 @@ public class ArtifactDeployerTest
{
private ArtifactDeployer artifactDeployer;
+ private SessionScope sessionScope;
+
protected void setUp()
throws Exception
{
super.setUp();
artifactDeployer = (ArtifactDeployer) lookup( ArtifactDeployer.ROLE );
+
+ sessionScope = lookup( SessionScope.class );
}
protected String component()
@@ -50,18 +58,28 @@ protected String component()
public void testArtifactInstallation()
throws Exception
{
- String artifactBasedir = new File( getBasedir(), "src/test/resources/artifact-install" ).getAbsolutePath();
+ sessionScope.enter();
+ try
+ {
+ sessionScope.seed(MavenSession.class, mock(MavenSession.class));
+
+ String artifactBasedir = new File( getBasedir(), "src/test/resources/artifact-install" ).getAbsolutePath();
- Artifact artifact = createArtifact( "artifact", "1.0" );
+ Artifact artifact = createArtifact( "artifact", "1.0" );
- File file = new File( artifactBasedir, "artifact-1.0.jar" );
- assertEquals( "dummy", FileUtils.fileRead( file, "UTF-8" ).trim() );
+ File file = new File( artifactBasedir, "artifact-1.0.jar" );
+ assertEquals( "dummy", FileUtils.fileRead( file, "UTF-8" ).trim() );
- artifactDeployer.deploy( file, artifact, remoteRepository(), localRepository() );
+ artifactDeployer.deploy( file, artifact, remoteRepository(), localRepository() );
- ArtifactRepository remoteRepository = remoteRepository();
- File deployedFile = new File( remoteRepository.getBasedir(), remoteRepository.pathOf( artifact ) );
- assertTrue( deployedFile.exists() );
- assertEquals( "dummy", FileUtils.fileRead( deployedFile, "UTF-8" ).trim() );
+ ArtifactRepository remoteRepository = remoteRepository();
+ File deployedFile = new File( remoteRepository.getBasedir(), remoteRepository.pathOf( artifact ) );
+ assertTrue( deployedFile.exists() );
+ assertEquals( "dummy", FileUtils.fileRead( deployedFile, "UTF-8" ).trim() );
+ }
+ finally
+ {
+ sessionScope.exit();
+ }
}
}
\ No newline at end of file
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/installer/ArtifactInstallerTest.java b/maven-compat/src/test/java/org/apache/maven/artifact/installer/ArtifactInstallerTest.java
index 21bfb2b70b81..66ba9e968f97 100644
--- a/maven-compat/src/test/java/org/apache/maven/artifact/installer/ArtifactInstallerTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/installer/ArtifactInstallerTest.java
@@ -23,6 +23,10 @@
import org.apache.maven.artifact.AbstractArtifactComponentTestCase;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.session.scope.internal.SessionScope;
+
+import static org.mockito.Mockito.mock;
/**
* @author Jason van Zyl
@@ -32,12 +36,16 @@ public class ArtifactInstallerTest
{
private ArtifactInstaller artifactInstaller;
+ private SessionScope sessionScope;
+
protected void setUp()
throws Exception
{
super.setUp();
artifactInstaller = (ArtifactInstaller) lookup( ArtifactInstaller.ROLE );
+
+ sessionScope = lookup( SessionScope.class );
}
protected String component()
@@ -48,14 +56,24 @@ protected String component()
public void testArtifactInstallation()
throws Exception
{
- String artifactBasedir = new File( getBasedir(), "src/test/resources/artifact-install" ).getAbsolutePath();
+ sessionScope.enter();
+ try
+ {
+ sessionScope.seed(MavenSession.class, mock(MavenSession.class));
+
+ String artifactBasedir = new File( getBasedir(), "src/test/resources/artifact-install" ).getAbsolutePath();
- Artifact artifact = createArtifact( "artifact", "1.0" );
+ Artifact artifact = createArtifact( "artifact", "1.0" );
- File source = new File( artifactBasedir, "artifact-1.0.jar" );
+ File source = new File( artifactBasedir, "artifact-1.0.jar" );
- artifactInstaller.install( source, artifact, localRepository() );
+ artifactInstaller.install( source, artifact, localRepository() );
- assertLocalArtifactPresent( artifact );
+ assertLocalArtifactPresent( artifact );
+ }
+ finally
+ {
+ sessionScope.exit();
+ }
}
}
\ No newline at end of file
diff --git a/maven-core/src/main/java/org/apache/maven/execution/infoproviders/DefaultPluginsMetadataInfoProvider.java b/maven-core/src/main/java/org/apache/maven/execution/infoproviders/DefaultPluginsMetadataInfoProvider.java
new file mode 100644
index 000000000000..616a3a88a4bf
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/execution/infoproviders/DefaultPluginsMetadataInfoProvider.java
@@ -0,0 +1,137 @@
+package org.apache.maven.execution.infoproviders;
+
+/*
+ * 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.util.Objects;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.Plugin;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.repository.internal.PluginsMetadataInfoProvider;
+import org.apache.maven.repository.legacy.metadata.ArtifactMetadata;
+import org.eclipse.aether.artifact.Artifact;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Default implementation of {@link PluginsMetadataInfoProvider}.
+ */
+@Named
+@Singleton
+public class DefaultPluginsMetadataInfoProvider
+ implements PluginsMetadataInfoProvider
+{
+ private final Provider mavenSessionProvider;
+
+ @Inject
+ public DefaultPluginsMetadataInfoProvider( final Provider mavenSessionProvider )
+ {
+ this.mavenSessionProvider = requireNonNull( mavenSessionProvider );
+ }
+
+ @Override
+ public PluginInfo getPluginInfo( final Artifact artifact )
+ {
+ MavenSession mavenSession = mavenSessionProvider.get();
+ if ( mavenSession != null )
+ {
+ MavenProject mavenProject = searchForProject( mavenSession, artifact );
+ if ( mavenProject != null && "maven-plugin".equals( mavenProject.getPackaging() ) )
+ {
+ Plugin plugin = searchForPluginGroupLevelRepositoryMetadata( mavenProject );
+
+ if ( plugin != null )
+ {
+ return new PluginInfo()
+ {
+ @Override
+ public String getPluginGroupId()
+ {
+ return artifact.getGroupId();
+ }
+
+ @Override
+ public String getPluginArtifactId()
+ {
+ return artifact.getArtifactId();
+ }
+
+ @Override
+ public String getPluginPrefix()
+ {
+ return plugin.getPrefix();
+ }
+
+ @Override
+ public String getPluginName()
+ {
+ return plugin.getName();
+ }
+ };
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private MavenProject searchForProject( MavenSession mavenSession, Artifact artifact )
+ {
+ for ( MavenProject mavenProject : mavenSession.getProjects() )
+ {
+ if ( mavenProject.getArtifact() != null
+ && Objects.equals( mavenProject.getGroupId(), artifact.getGroupId() )
+ && Objects.equals( mavenProject.getArtifactId(), artifact.getArtifactId() ) )
+ {
+ return mavenProject;
+ }
+ }
+ return null;
+ }
+
+ private Plugin searchForPluginGroupLevelRepositoryMetadata( MavenProject mavenProject )
+ {
+ org.apache.maven.artifact.Artifact projectArtifact = mavenProject.getArtifact();
+ for ( ArtifactMetadata artifactMetadata : projectArtifact.getMetadataList() )
+ {
+ if ( artifactMetadata instanceof RepositoryMetadata )
+ {
+ RepositoryMetadata repositoryMetadata = (RepositoryMetadata) artifactMetadata;
+ Metadata metadata = repositoryMetadata.getMetadata();
+
+ for ( Plugin plugin : metadata.getPlugins() )
+ {
+ if ( Objects.equals( plugin.getArtifactId(), mavenProject.getArtifactId() ) )
+ {
+ return plugin;
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml b/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml
index 4a303db572bc..e35f931596dd 100644
--- a/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml
+++ b/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml
@@ -41,10 +41,10 @@ Mappings to default lifecycle, specific for each packaging.
- org.apache.maven.plugins:maven-install-plugin:2.4:install
+ org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
- org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
+ org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M2:deploy
@@ -85,10 +85,10 @@ Mappings to default lifecycle, specific for each packaging.
org.apache.maven.plugins:maven-jar-plugin:2.4:jar
- org.apache.maven.plugins:maven-install-plugin:2.4:install
+ org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
- org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
+ org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M2:deploy
@@ -129,10 +129,10 @@ Mappings to default lifecycle, specific for each packaging.
org.apache.maven.plugins:maven-ejb-plugin:2.3:ejb
- org.apache.maven.plugins:maven-install-plugin:2.4:install
+ org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
- org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
+ org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M2:deploy
@@ -177,10 +177,10 @@ Mappings to default lifecycle, specific for each packaging.
org.apache.maven.plugins:maven-plugin-plugin:3.2:addPluginArtifactMetadata
- org.apache.maven.plugins:maven-install-plugin:2.4:install
+ org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
- org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
+ org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M2:deploy
@@ -221,10 +221,10 @@ Mappings to default lifecycle, specific for each packaging.
org.apache.maven.plugins:maven-war-plugin:2.2:war
- org.apache.maven.plugins:maven-install-plugin:2.4:install
+ org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
- org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
+ org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M2:deploy
@@ -256,10 +256,10 @@ Mappings to default lifecycle, specific for each packaging.
org.apache.maven.plugins:maven-ear-plugin:2.8:ear
- org.apache.maven.plugins:maven-install-plugin:2.4:install
+ org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
- org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
+ org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M2:deploy
@@ -300,10 +300,10 @@ Mappings to default lifecycle, specific for each packaging.
org.apache.maven.plugins:maven-rar-plugin:2.2:rar
- org.apache.maven.plugins:maven-install-plugin:2.4:install
+ org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
- org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
+ org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M2:deploy
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadata.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadata.java
new file mode 100644
index 000000000000..7a6c45abfe79
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadata.java
@@ -0,0 +1,117 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.Plugin;
+import org.apache.maven.repository.internal.PluginsMetadataInfoProvider.PluginInfo;
+import org.eclipse.aether.artifact.Artifact;
+
+/**
+ * Plugin G level metadata.
+ */
+final class PluginsMetadata
+ extends MavenMetadata
+{
+ private final PluginInfo pluginInfo;
+
+ PluginsMetadata( PluginInfo pluginInfo, Date timestamp )
+ {
+ super( createRepositoryMetadata( pluginInfo ), null, timestamp );
+ this.pluginInfo = pluginInfo;
+ }
+
+ PluginsMetadata( PluginInfo pluginInfo, File file, Date timestamp )
+ {
+ super( createRepositoryMetadata( pluginInfo ), file, timestamp );
+ this.pluginInfo = pluginInfo;
+ }
+
+ private static Metadata createRepositoryMetadata( PluginInfo pluginInfo )
+ {
+ Metadata result = new Metadata();
+ Plugin plugin = new Plugin();
+ plugin.setPrefix( pluginInfo.getPluginPrefix() );
+ plugin.setArtifactId( pluginInfo.getPluginArtifactId() );
+ plugin.setName( pluginInfo.getPluginName() );
+ result.getPlugins().add( plugin );
+ return result;
+ }
+
+ @Override
+ protected void merge( Metadata recessive )
+ {
+ List recessivePlugins = recessive.getPlugins();
+ List plugins = metadata.getPlugins();
+ if ( !plugins.isEmpty() )
+ {
+ LinkedHashMap mergedPlugins = new LinkedHashMap<>();
+ recessivePlugins.forEach( p -> mergedPlugins.put( p.getPrefix(), p ) );
+ plugins.forEach( p -> mergedPlugins.put( p.getPrefix(), p ) );
+ metadata.setPlugins( new ArrayList<>( mergedPlugins.values() ) );
+ }
+ }
+
+ public Object getKey()
+ {
+ return getGroupId();
+ }
+
+ public static Object getKey( Artifact artifact )
+ {
+ return artifact.getGroupId();
+ }
+
+ @Override
+ public MavenMetadata setFile( File file )
+ {
+ return new PluginsMetadata( pluginInfo, file, timestamp );
+ }
+
+ @Override
+ public String getGroupId()
+ {
+ return pluginInfo.getPluginGroupId();
+ }
+
+ @Override
+ public String getArtifactId()
+ {
+ return "";
+ }
+
+ @Override
+ public String getVersion()
+ {
+ return "";
+ }
+
+ @Override
+ public Nature getNature()
+ {
+ return Nature.RELEASE_OR_SNAPSHOT;
+ }
+}
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadataGenerator.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadataGenerator.java
new file mode 100644
index 000000000000..4f355686517c
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/PluginsMetadataGenerator.java
@@ -0,0 +1,130 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.maven.repository.internal.PluginsMetadataInfoProvider.PluginInfo;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.impl.MetadataGenerator;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.util.ConfigUtils;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Plugin G level metadata.
+ */
+class PluginsMetadataGenerator
+ implements MetadataGenerator
+{
+ private final PluginsMetadataInfoProvider pluginsMetadataInfoProvider;
+
+ private final Map