diff --git a/maven-bom/pom.xml b/maven-bom/pom.xml
index 3f9f983e31c2..d008f106d3fd 100644
--- a/maven-bom/pom.xml
+++ b/maven-bom/pom.xml
@@ -78,6 +78,18 @@ under the License.
maven-builder-support
${project.version}
+
+ org.apache.maven
+ maven-container
+ ${project.version}
+
+
+ org.apache.maven
+ maven-container
+ ${project.version}
+ tests
+ test-jar
+
org.apache.maven
maven-core
diff --git a/maven-compat/pom.xml b/maven-compat/pom.xml
index d27b6893d851..cdb17029a59a 100644
--- a/maven-compat/pom.xml
+++ b/maven-compat/pom.xml
@@ -100,8 +100,10 @@ under the License.
- org.codehaus.plexus
- plexus-testing
+ org.apache.maven
+ maven-container
+ tests
+ test-jar
test
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java b/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
index 735c6499f210..9dd82d0407ee 100644
--- a/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
@@ -32,11 +32,11 @@
import javax.inject.Inject;
import javax.inject.Named;
-import org.codehaus.plexus.testing.PlexusTest;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenSession;
@@ -67,14 +67,14 @@
import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
import org.junit.jupiter.api.BeforeEach;
-import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
+import static org.apache.maven.container.test.MavenTestExtension.getBasedir;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* @author Jason van Zyl
*/
-@PlexusTest
+@MavenTest
public abstract class AbstractArtifactComponentTestCase //extends PlexusTestCase
{
@Inject
@@ -101,7 +101,7 @@ public void setUp()
throws Exception
{
RepositorySystemSession repoSession = initRepoSession();
- MavenSession session = new MavenSession( getContainer(), repoSession, new DefaultMavenExecutionRequest(),
+ MavenSession session = new MavenSession( repoSession, new DefaultMavenExecutionRequest(),
new DefaultMavenExecutionResult() );
legacySupport.setSession( session );
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 53cc388acd14..a0605a34bd8b 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
@@ -21,18 +21,18 @@
import java.io.File;
+import javax.inject.Inject;
+
import org.apache.maven.artifact.AbstractArtifactComponentTestCase;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.codehaus.plexus.util.FileUtils;
import org.junit.jupiter.api.Test;
-import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
+import static org.apache.maven.container.test.MavenTestExtension.getBasedir;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import javax.inject.Inject;
-
/**
* @author Jason van Zyl
*/
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/factory/DefaultArtifactFactoryTest.java b/maven-compat/src/test/java/org/apache/maven/artifact/factory/DefaultArtifactFactoryTest.java
index d124894d6d26..76ac776e3d64 100644
--- a/maven-compat/src/test/java/org/apache/maven/artifact/factory/DefaultArtifactFactoryTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/factory/DefaultArtifactFactoryTest.java
@@ -21,14 +21,14 @@
import javax.inject.Inject;
-import org.codehaus.plexus.testing.PlexusTest;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.versioning.VersionRange;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
-@PlexusTest
+@MavenTest
public class DefaultArtifactFactoryTest
{
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 ca99ab2a53cc..413d9ee752b4 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
@@ -27,7 +27,7 @@
import javax.inject.Inject;
-import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
+import static org.apache.maven.container.test.MavenTestExtension.getBasedir;
/**
* @author Jason van Zyl
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java b/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java
index 68a7522d5f99..8fdef0e32fe9 100644
--- a/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java
@@ -17,12 +17,12 @@
import java.util.List;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.repository.legacy.resolver.transform.ArtifactTransformation;
import org.apache.maven.repository.legacy.resolver.transform.ArtifactTransformationManager;
import org.apache.maven.repository.legacy.resolver.transform.LatestArtifactTransformation;
import org.apache.maven.repository.legacy.resolver.transform.ReleaseArtifactTransformation;
import org.apache.maven.repository.legacy.resolver.transform.SnapshotTransformation;
-import org.codehaus.plexus.testing.PlexusTest;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -31,7 +31,7 @@
import javax.inject.Inject;
/** @author Jason van Zyl */
-@PlexusTest
+@MavenTest
public class TransformationManagerTest
{
@Inject
diff --git a/maven-compat/src/test/java/org/apache/maven/profiles/manager/DefaultProfileManagerTest.java b/maven-compat/src/test/java/org/apache/maven/profiles/manager/DefaultProfileManagerTest.java
index bcb50a1ad2db..a32123d30bed 100644
--- a/maven-compat/src/test/java/org/apache/maven/profiles/manager/DefaultProfileManagerTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/profiles/manager/DefaultProfileManagerTest.java
@@ -24,7 +24,7 @@
import javax.inject.Inject;
-import org.codehaus.plexus.testing.PlexusTest;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.model.Activation;
import org.apache.maven.model.ActivationProperty;
import org.apache.maven.model.Profile;
@@ -37,7 +37,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-@PlexusTest
+@MavenTest
public class DefaultProfileManagerTest
{
diff --git a/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java b/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
index 482a5b4730d6..4e589228fbeb 100644
--- a/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
+++ b/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
@@ -24,7 +24,7 @@
import javax.inject.Inject;
-import org.codehaus.plexus.testing.PlexusTest;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.model.building.ModelBuildingException;
@@ -40,7 +40,7 @@
/**
* @author Jason van Zyl
*/
-@PlexusTest
+@MavenTest
public abstract class AbstractMavenProjectTestCase
{
protected ProjectBuilder projectBuilder;
diff --git a/maven-compat/src/test/java/org/apache/maven/project/inheritance/AbstractProjectInheritanceTestCase.java b/maven-compat/src/test/java/org/apache/maven/project/inheritance/AbstractProjectInheritanceTestCase.java
index af3655f826a4..93ca38bc8b2e 100644
--- a/maven-compat/src/test/java/org/apache/maven/project/inheritance/AbstractProjectInheritanceTestCase.java
+++ b/maven-compat/src/test/java/org/apache/maven/project/inheritance/AbstractProjectInheritanceTestCase.java
@@ -23,7 +23,7 @@
import org.apache.maven.project.AbstractMavenProjectTestCase;
-import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
+import static org.apache.maven.container.test.MavenTestExtension.getTestFile;
/**
* @author Jason van Zyl
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java b/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
index f68a9961fb80..557856bd5ff0 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
@@ -24,6 +24,7 @@
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenSession;
@@ -32,14 +33,13 @@
import org.apache.maven.model.RepositoryPolicy;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.repository.legacy.LegacyRepositorySystem;
-import org.codehaus.plexus.testing.PlexusTest;
import org.codehaus.plexus.PlexusContainer;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
import org.eclipse.aether.repository.LocalRepository;
import org.junit.jupiter.api.Test;
-import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
+import static org.apache.maven.container.test.MavenTestExtension.getBasedir;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -51,7 +51,7 @@
*
* @author Benjamin Bentmann
*/
-@PlexusTest
+@MavenTest
public class LegacyRepositorySystemTest
{
@Inject
@@ -113,7 +113,7 @@ public void testThatASystemScopedDependencyIsNotResolvedFromRepositories()
LocalRepository localRepo = new LocalRepository( request.getLocalRepository().getBasedir() );
session.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( session, localRepo ) );
LegacySupport legacySupport = container.lookup( LegacySupport.class );
- legacySupport.setSession( new MavenSession( container, session, new DefaultMavenExecutionRequest(),
+ legacySupport.setSession( new MavenSession( session, new DefaultMavenExecutionRequest(),
new DefaultMavenExecutionResult() ) );
ArtifactResolutionResult result = repositorySystem.resolve( request );
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/MirrorProcessorTest.java b/maven-compat/src/test/java/org/apache/maven/repository/MirrorProcessorTest.java
index 9e8ab4e27192..2c1de8fe09d1 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/MirrorProcessorTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/MirrorProcessorTest.java
@@ -22,7 +22,7 @@
import java.util.Arrays;
import java.util.List;
-import org.codehaus.plexus.testing.PlexusTest;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
@@ -36,7 +36,7 @@
import javax.inject.Inject;
-@PlexusTest
+@MavenTest
public class MirrorProcessorTest
{
@Inject
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java
index 14961c10d2d8..4dd4875da1a2 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java
@@ -33,8 +33,8 @@
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
-import org.codehaus.plexus.testing.PlexusTest;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.UnsupportedProtocolException;
@@ -47,7 +47,7 @@
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
-import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
+import static org.apache.maven.container.test.MavenTestExtension.getTestFile;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -60,7 +60,7 @@
/**
* @author Michal Maczka
*/
-@PlexusTest
+@MavenTest
public class DefaultWagonManagerTest
{
@Inject
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/legacy/LegacyRepositorySystemTest.java b/maven-compat/src/test/java/org/apache/maven/repository/legacy/LegacyRepositorySystemTest.java
index ab9399504309..33300f6b72c8 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/legacy/LegacyRepositorySystemTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/legacy/LegacyRepositorySystemTest.java
@@ -20,9 +20,9 @@
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.Authentication;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.settings.Server;
-import org.codehaus.plexus.testing.PlexusTest;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -35,7 +35,7 @@
*
* @author Benjamin Bentmann
*/
-@PlexusTest
+@MavenTest
public class LegacyRepositorySystemTest
{
@Inject
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java b/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
index 56018d39b2f3..cc9655c319a0 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
@@ -48,8 +48,8 @@
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.repository.legacy.metadata.MetadataResolutionRequest;
-import org.codehaus.plexus.testing.PlexusTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@@ -64,7 +64,7 @@
*
* @author Brett Porter
*/
-@PlexusTest
+@MavenTest
public class DefaultArtifactCollectorTest
{
@Inject
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/AbstractConflictResolverTest.java b/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/AbstractConflictResolverTest.java
index 178933996eea..8ea3ef8b2ecb 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/AbstractConflictResolverTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/AbstractConflictResolverTest.java
@@ -27,7 +27,7 @@
import org.apache.maven.artifact.resolver.ResolutionNode;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
-import org.codehaus.plexus.testing.PlexusTest;
+import org.apache.maven.container.test.MavenTest;
import org.codehaus.plexus.PlexusContainer;
import org.junit.jupiter.api.BeforeEach;
@@ -41,7 +41,7 @@
*
* @author Mark Hobson
*/
-@PlexusTest
+@MavenTest
public abstract class AbstractConflictResolverTest
{
// constants --------------------------------------------------------------
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultClasspathTransformationTest.java b/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultClasspathTransformationTest.java
index 348dd978fd87..16c2c8fb48f9 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultClasspathTransformationTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultClasspathTransformationTest.java
@@ -18,7 +18,7 @@
import javax.inject.Inject;
import org.apache.maven.artifact.ArtifactScopeEnum;
-import org.codehaus.plexus.testing.PlexusTest;
+import org.apache.maven.container.test.MavenTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
@@ -30,7 +30,7 @@
* @author Oleg Gusakov
*
*/
-@PlexusTest
+@MavenTest
public class DefaultClasspathTransformationTest
{
@Inject
diff --git a/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolverTest.java b/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolverTest.java
index 67a003ab171e..6aa5cd8a9aae 100644
--- a/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolverTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolverTest.java
@@ -18,7 +18,7 @@
import javax.inject.Inject;
import org.apache.maven.artifact.ArtifactScopeEnum;
-import org.codehaus.plexus.testing.PlexusTest;
+import org.apache.maven.container.test.MavenTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -30,7 +30,7 @@
* @author Oleg Gusakov
*
*/
-@PlexusTest
+@MavenTest
public class DefaultGraphConflictResolverTest
{
@Inject
diff --git a/maven-container/pom.xml b/maven-container/pom.xml
new file mode 100644
index 000000000000..12afe17f878a
--- /dev/null
+++ b/maven-container/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+ 4.0.0
+
+
+ maven
+ org.apache.maven
+ 4.0.0-alpha-1-SNAPSHOT
+
+
+ maven-container
+
+
+
+ org.eclipse.sisu
+ org.eclipse.sisu.plexus
+
+
+ org.eclipse.sisu
+ org.eclipse.sisu.inject
+
+
+ com.google.inject
+ guice
+ no_aop
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ test-jar
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-container/src/main/java/org/apache/maven/container/Container.java b/maven-container/src/main/java/org/apache/maven/container/Container.java
new file mode 100644
index 000000000000..0fce8eea99c8
--- /dev/null
+++ b/maven-container/src/main/java/org/apache/maven/container/Container.java
@@ -0,0 +1,64 @@
+package org.apache.maven.container;
+
+/*
+ * 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.List;
+import java.util.Map;
+
+import com.google.inject.Module;
+import org.codehaus.plexus.classworlds.ClassWorld;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.component.repository.ComponentDescriptor;
+import org.codehaus.plexus.logging.LoggerManager;
+
+public interface Container
+{
+
+ T lookup( Class role );
+
+ T lookup( Class role, String name );
+
+ Map lookupMap( Class role );
+
+ List lookupList( Class role );
+
+ void addComponent( Class role, I impl );
+
+ void addComponent( Class role, Class impl );
+
+ void addComponent( ComponentDescriptor> componentDescriptor );
+
+ void release( Object component );
+
+ ClassRealm setLookupRealm( ClassRealm realm );
+
+ void discoverComponents( ClassRealm realm, Module... modules );
+
+ ClassWorld getClassWorld();
+
+ ClassRealm getContainerRealm();
+
+ void dispose();
+
+ // configuration
+
+ void setLoggerManager( LoggerManager loggerManager );
+
+}
diff --git a/maven-container/src/main/java/org/apache/maven/container/DefaultContainer.java b/maven-container/src/main/java/org/apache/maven/container/DefaultContainer.java
new file mode 100644
index 000000000000..e55b54f8c57d
--- /dev/null
+++ b/maven-container/src/main/java/org/apache/maven/container/DefaultContainer.java
@@ -0,0 +1,184 @@
+package org.apache.maven.container;
+
+/*
+ * 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.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import com.google.inject.Module;
+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.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.component.repository.ComponentDescriptor;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.logging.LoggerManager;
+import org.eclipse.sisu.plexus.Hints;
+
+import static java.util.Objects.requireNonNull;
+
+public class DefaultContainer implements Container
+{
+
+ private final DefaultPlexusContainer container;
+
+ public DefaultContainer( ClassRealm realm )
+ {
+ try
+ {
+ ContainerConfiguration cc = new DefaultContainerConfiguration().setClassWorld( realm.getWorld() )
+ .setRealm( realm ).setClassPathScanning( PlexusConstants.SCANNING_INDEX ).setAutoWiring( true )
+ .setJSR250Lifecycle( true ).setName( "maven" );
+ this.container = new DefaultPlexusContainer( cc );
+ this.container.addComponent( this, Container.class.getName() );
+ }
+ catch ( PlexusContainerException e )
+ {
+ throw new RuntimeException( "Unable to create container", e );
+ }
+ }
+
+ public DefaultContainer( final DefaultPlexusContainer container )
+ {
+ this.container = requireNonNull( container );
+ this.container.addComponent( this, Container.class.getName() );
+ }
+
+ public void setLoggerManager( LoggerManager loggerManager )
+ {
+ container.setLoggerManager( loggerManager );
+ }
+
+ /**
+ * Performs a component lookup obeying "plexus visibility rules". Returns {@code null} if no component found.
+ */
+ public T lookup( final Class role )
+ {
+ return lookup( role, "" );
+ }
+
+ /**
+ * Performs a component lookup obeying "plexus visibility rules". Returns {@code null} if no component found.
+ */
+ public T lookup( final Class role, final String hint )
+ {
+ try
+ {
+ return container.lookup( role, hint );
+ }
+ catch ( ComponentLookupException e )
+ {
+ if ( e.getCause() instanceof NoSuchElementException )
+ {
+ return null;
+ }
+ throw new RuntimeException( e );
+ }
+ }
+
+ /**
+ * Performs a map component lookup obeying "plexus visibility rules". Never returns {@code null}.
+ */
+ public Map lookupMap( final Class role )
+ {
+ try
+ {
+ return container.lookupMap( role );
+ }
+ catch ( ComponentLookupException e )
+ {
+ throw new RuntimeException( e );
+ }
+ }
+
+ @Override
+ public List lookupList( Class role )
+ {
+ try
+ {
+ return container.lookupList( role );
+ }
+ catch ( ComponentLookupException e )
+ {
+ throw new RuntimeException( e );
+ }
+ }
+
+ @Override
+ public void release( Object component )
+ {
+ container.release( component );
+ }
+
+ @Override
+ public void addComponent( Class role, I impl )
+ {
+ container.addComponent( impl, role, Hints.DEFAULT_HINT );
+ }
+
+ @Override
+ public void addComponent( Class role, Class impl )
+ {
+ ComponentDescriptor extends R> cd = new ComponentDescriptor<>( impl, getContainerRealm() );
+ cd.setRoleClass( role );
+ addComponent( cd );
+ }
+
+ @Override
+ public void addComponent( ComponentDescriptor> componentDescriptor )
+ {
+ container.addComponentDescriptor( componentDescriptor );
+ }
+
+ @Override
+ public ClassRealm setLookupRealm( ClassRealm realm )
+ {
+ return container.setLookupRealm( realm );
+ }
+
+ @Override
+ public void discoverComponents( ClassRealm realm, Module... modules )
+ {
+ container.discoverComponents( realm, modules );
+ }
+
+ @Override
+ public ClassWorld getClassWorld()
+ {
+ return getContainerRealm().getWorld();
+ }
+
+ @Override
+ public ClassRealm getContainerRealm()
+ {
+ return container.getContainerRealm();
+ }
+
+ @Override
+ public void dispose()
+ {
+ container.dispose();
+ }
+
+}
diff --git a/maven-container/src/test/java/org/apache/maven/container/test/MavenTest.java b/maven-container/src/test/java/org/apache/maven/container/test/MavenTest.java
new file mode 100644
index 000000000000..f8b058082409
--- /dev/null
+++ b/maven-container/src/test/java/org/apache/maven/container/test/MavenTest.java
@@ -0,0 +1,38 @@
+package org.apache.maven.container.test;
+
+/*
+ * 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.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.junit.jupiter.api.extension.ExtendWith;
+
+/**
+ * Plexus test
+ */
+@Retention( RetentionPolicy.RUNTIME )
+@ExtendWith( MavenTestExtension.class )
+@Target( ElementType.TYPE )
+public @interface MavenTest
+{
+
+}
diff --git a/maven-container/src/test/java/org/apache/maven/container/test/MavenTestExtension.java b/maven-container/src/test/java/org/apache/maven/container/test/MavenTestExtension.java
new file mode 100644
index 000000000000..d0f8b6213fc6
--- /dev/null
+++ b/maven-container/src/test/java/org/apache/maven/container/test/MavenTestExtension.java
@@ -0,0 +1,325 @@
+package org.apache.maven.container.test;
+
+/*
+ * 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.
+ */
+
+/*
+ * Copyright 2001-2006 Codehaus Foundation.
+ *
+ * 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
+ *
+ * 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.InputStream;
+import java.util.Collections;
+
+import org.apache.maven.container.Container;
+import org.apache.maven.container.DefaultContainer;
+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.configuration.PlexusConfiguration;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.DefaultContext;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+/**
+ * This is a slightly modified version of the original plexus class
+ * available at https://raw.githubusercontent.com/codehaus-plexus/plexus-containers/master/plexus-container-default/
+ * src/main/java/org/codehaus/plexus/PlexusTestCase.java
+ * in order to migrate the tests to JUnit 4.
+ *
+ * @author Jason van Zyl
+ * @author Trygve Laugstøl
+ * @author Michal Maczka
+ * @author Guillaume Nodet
+ */
+public class MavenTestExtension implements BeforeEachCallback, AfterEachCallback
+{
+ private ExtensionContext context;
+ private Container container;
+ private DefaultPlexusContainer plexus;
+
+ private static String basedir;
+
+ @Override
+ public void beforeEach( ExtensionContext context )
+ throws Exception
+ {
+ basedir = getBasedir();
+ this.context = context;
+
+ getContainer().addComponent( Container.class, getContainer() );
+
+ plexus.addPlexusInjector( Collections.emptyList(),
+ binder -> binder.requestInjection( context.getRequiredTestInstance() ) );
+ }
+
+ @SuppressWarnings( "ResultOfMethodCallIgnored" )
+ protected void setupContainer()
+ {
+ // ----------------------------------------------------------------------------
+ // Context Setup
+ // ----------------------------------------------------------------------------
+
+ DefaultContext context = new DefaultContext();
+
+ context.put( "basedir", getBasedir() );
+
+ customizeContext( context );
+
+ boolean hasPlexusHome = context.contains( "plexus.home" );
+
+ if ( !hasPlexusHome )
+ {
+ File f = getTestFile( "target/plexus-home" );
+
+ if ( !f.isDirectory() )
+ {
+ f.mkdir();
+ }
+
+ context.put( "plexus.home", f.getAbsolutePath() );
+ }
+
+ // ----------------------------------------------------------------------------
+ // Configuration
+ // ----------------------------------------------------------------------------
+
+ String config = getCustomConfigurationName();
+
+ ContainerConfiguration containerConfiguration = new DefaultContainerConfiguration()
+ .setName( "test" )
+ .setContext( context.getContextData() );
+
+ if ( config != null )
+ {
+ containerConfiguration.setContainerConfiguration( config );
+ }
+ else
+ {
+ String resource = getConfigurationName( null );
+
+ containerConfiguration.setContainerConfiguration( resource );
+ }
+
+ customizeContainerConfiguration( containerConfiguration );
+
+ try
+ {
+ plexus = new DefaultPlexusContainer( containerConfiguration );
+ }
+ catch ( PlexusContainerException e )
+ {
+ throw new IllegalArgumentException( "Failed to create plexus container.", e );
+ }
+
+ container = new DefaultContainer( plexus );
+ }
+
+ /**
+ * Allow custom test case implementations do augment the default container configuration before
+ * executing tests.
+ *
+ * @param containerConfiguration {@link ContainerConfiguration}.
+ */
+ protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
+ {
+ containerConfiguration.setAutoWiring( true );
+ containerConfiguration.setClassPathScanning( PlexusConstants.SCANNING_INDEX );
+ }
+
+ protected void customizeContext( Context context )
+ {
+ }
+
+ protected PlexusConfiguration customizeComponentConfiguration()
+ {
+ return null;
+ }
+
+ @Override
+ public void afterEach( ExtensionContext context )
+ throws Exception
+ {
+ if ( container != null )
+ {
+ container.dispose();
+
+ container = null;
+ }
+ }
+
+ public Container getContainer()
+ {
+ if ( container == null )
+ {
+ setupContainer();
+ }
+
+ return container;
+ }
+
+ protected InputStream getConfiguration()
+ throws Exception
+ {
+ return getConfiguration( null );
+ }
+
+ protected InputStream getConfiguration( String subname )
+ throws Exception
+ {
+ return getResourceAsStream( getConfigurationName( subname ) );
+ }
+
+ protected String getCustomConfigurationName()
+ {
+ return null;
+ }
+
+ /**
+ * Allow the retrieval of a container configuration that is based on the name
+ * of the test class being run. So if you have a test class called org.foo.FunTest, then
+ * this will produce a resource name of org/foo/FunTest.xml which would be used to
+ * configure the Plexus container before running your test.
+ *
+ * @param subname the subname
+ * @return A configruation name
+ */
+ protected String getConfigurationName( String subname )
+ {
+ Class> testClass = context.getRequiredTestClass();
+ for ( Class> clazz = testClass;
+ clazz != null;
+ clazz = clazz.getSuperclass() )
+ {
+ String name = clazz.getName().replace( '.', '/' ) + ".xml";
+ if ( testClass.getClassLoader().getResource( name ) != null )
+ {
+ return name;
+ }
+ }
+ return null;
+ }
+
+ protected InputStream getResourceAsStream( String resource )
+ {
+ return context.getRequiredTestClass().getResourceAsStream( resource );
+ }
+
+ protected ClassLoader getClassLoader()
+ {
+ return context.getRequiredTestClass().getClassLoader();
+ }
+
+ // ----------------------------------------------------------------------
+ // Container access
+ // ----------------------------------------------------------------------
+
+ protected T lookup( Class componentClass )
+ {
+ return getContainer().lookup( componentClass );
+ }
+
+ protected T lookup( Class componentClass, String roleHint )
+ {
+ return getContainer().lookup( componentClass, roleHint );
+ }
+
+ protected void release( Object component )
+ {
+ getContainer().release( component );
+ }
+
+ // ----------------------------------------------------------------------
+ // Helper methods for sub classes
+ // ----------------------------------------------------------------------
+
+ public static File getTestFile( String path )
+ {
+ return new File( getBasedir(), path );
+ }
+
+ public static File getTestFile( String basedir,
+ String path )
+ {
+ File basedirFile = new File( basedir );
+
+ if ( !basedirFile.isAbsolute() )
+ {
+ basedirFile = getTestFile( basedir );
+ }
+
+ return new File( basedirFile, path );
+ }
+
+ public static String getTestPath( String path )
+ {
+ return getTestFile( path ).getAbsolutePath();
+ }
+
+ public static String getTestPath( String basedir,
+ String path )
+ {
+ return getTestFile( basedir, path ).getAbsolutePath();
+ }
+
+ public static String getBasedir()
+ {
+ if ( basedir != null )
+ {
+ return basedir;
+ }
+
+ basedir = System.getProperty( "basedir" );
+
+ if ( basedir == null )
+ {
+ basedir = new File( "" ).getAbsolutePath();
+ }
+
+ return basedir;
+ }
+
+ public String getTestConfiguration()
+ {
+ return getTestConfiguration( context.getRequiredTestClass() );
+ }
+
+ public static String getTestConfiguration( Class> clazz )
+ {
+ String s = clazz.getName().replace( '.', '/' );
+
+ return s.substring( 0, s.indexOf( "$" ) ) + ".xml";
+ }
+}
diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index 77c514045009..191f18efcf4f 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -60,6 +60,10 @@ under the License.
org.apache.maven
maven-artifact
+
+ org.apache.maven
+ maven-container
+
org.apache.maven
maven-plugin-api
@@ -134,6 +138,13 @@ under the License.
org.apache.commons
commons-lang3
+
+ org.apache.maven
+ maven-container
+ tests
+ test-jar
+ test
+
org.slf4j
slf4j-simple
diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
index f80833b2e386..db6158d1e25e 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -32,6 +32,7 @@
import org.apache.maven.execution.ProjectDependencyGraph;
import org.apache.maven.graph.GraphBuilder;
import org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory;
+import org.apache.maven.container.Container;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.lifecycle.internal.ExecutionEventCatapult;
import org.apache.maven.lifecycle.internal.LifecycleStarter;
@@ -46,8 +47,6 @@
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.repository.LocalRepositoryNotAccessibleException;
import org.apache.maven.session.scope.internal.SessionScope;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.Logger;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystemSession;
@@ -68,6 +67,7 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Stream;
@@ -93,7 +93,7 @@ public class DefaultMaven
private LifecycleStarter lifecycleStarter;
@Inject
- protected PlexusContainer container;
+ protected Container container;
@Inject
private ExecutionEventCatapult eventCatapult;
@@ -208,7 +208,7 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request )
{
DefaultRepositorySystemSession repoSession =
(DefaultRepositorySystemSession) newRepositorySession( request );
- MavenSession session = new MavenSession( container, repoSession, request, result );
+ MavenSession session = new MavenSession( repoSession, request, result );
sessionScope.seed( MavenSession.class, session );
@@ -252,14 +252,11 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request, MavenSess
return addExceptionToResult( result, e );
}
- WorkspaceReader reactorWorkspace;
- try
+ WorkspaceReader reactorWorkspace = container.lookup( WorkspaceReader.class, ReactorReader.HINT );
+ if ( reactorWorkspace == null )
{
- reactorWorkspace = container.lookup( WorkspaceReader.class, ReactorReader.HINT );
- }
- catch ( ComponentLookupException e )
- {
- return addExceptionToResult( result, e );
+ return addExceptionToResult( result, new NoSuchElementException( "Unable to find a component with"
+ + " role=" + WorkspaceReader.class.getName() + " and hint=" + ReactorReader.HINT ) );
}
//
@@ -456,15 +453,7 @@ private Collection getLifecycleParticipants(
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
try
{
- try
- {
- lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) );
- }
- catch ( ComponentLookupException e )
- {
- // this is just silly, lookupList should return an empty list!
- logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() );
- }
+ lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) );
Collection scannedRealms = new HashSet<>();
@@ -476,15 +465,7 @@ private Collection getLifecycleParticipants(
{
Thread.currentThread().setContextClassLoader( projectRealm );
- try
- {
- lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) );
- }
- catch ( ComponentLookupException e )
- {
- // this is just silly, lookupList should return an empty list!
- logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() );
- }
+ lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) );
}
}
}
diff --git a/maven-core/src/main/java/org/apache/maven/artifact/InvalidRepositoryException.java b/maven-core/src/main/java/org/apache/maven/artifact/InvalidRepositoryException.java
index 62991f11dd44..0cf1afee1b72 100644
--- a/maven-core/src/main/java/org/apache/maven/artifact/InvalidRepositoryException.java
+++ b/maven-core/src/main/java/org/apache/maven/artifact/InvalidRepositoryException.java
@@ -19,10 +19,6 @@
* under the License.
*/
-import java.net.MalformedURLException;
-
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-
/**
* Error constructing an artifact repository.
*
@@ -33,18 +29,6 @@ public class InvalidRepositoryException
{
private final String repositoryId;
- public InvalidRepositoryException( String message, String repositoryId, MalformedURLException cause )
- {
- super( message, cause );
- this.repositoryId = repositoryId;
- }
-
- protected InvalidRepositoryException( String message, String repositoryId, ComponentLookupException cause )
- {
- super( message, cause );
- this.repositoryId = repositoryId;
- }
-
@Deprecated
public InvalidRepositoryException( String message, Throwable t )
{
@@ -58,6 +42,12 @@ public InvalidRepositoryException( String message, String repositoryId )
this.repositoryId = repositoryId;
}
+ public InvalidRepositoryException( String message, String repositoryId, Throwable t )
+ {
+ super( message, t );
+ this.repositoryId = repositoryId;
+ }
+
public String getRepositoryId()
{
return repositoryId;
diff --git a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
index cf3d746f889d..450779dcf602 100644
--- a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
+++ b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
@@ -38,10 +38,9 @@
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.classrealm.ClassRealmRequest.RealmType;
import org.apache.maven.extension.internal.CoreExportsProvider;
+import org.apache.maven.container.Container;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
-import org.codehaus.plexus.MutablePlexusContainer;
-import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
@@ -91,11 +90,11 @@ public class DefaultClassRealmManager
private final Set providedArtifacts;
@Inject
- public DefaultClassRealmManager( Logger logger, PlexusContainer container,
+ public DefaultClassRealmManager( Logger logger, Container container,
List delegates, CoreExportsProvider exports )
{
this.logger = logger;
- this.world = ( (MutablePlexusContainer) container ).getClassWorld();
+ this.world = container.getClassWorld();
this.containerRealm = container.getContainerRealm();
this.delegates = delegates;
diff --git a/maven-core/src/main/java/org/apache/maven/eventspy/internal/DefaultEventSpyDispatcher.java b/maven-core/src/main/java/org/apache/maven/eventspy/internal/DefaultEventSpyDispatcher.java
new file mode 100644
index 000000000000..217ebec6976a
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/eventspy/internal/DefaultEventSpyDispatcher.java
@@ -0,0 +1,149 @@
+package org.apache.maven.eventspy.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.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.eventspy.EventSpy;
+import org.apache.maven.execution.ExecutionListener;
+import org.codehaus.plexus.logging.Logger;
+import org.eclipse.aether.RepositoryListener;
+
+/**
+ * Dispatches callbacks to all registered eventspies.
+ * @since 3.0.2
+ */
+@Named
+@Singleton
+public class DefaultEventSpyDispatcher implements EventSpyDispatcher
+{
+
+ @Inject
+ private Logger logger;
+
+ private List eventSpies;
+
+ @Inject
+ public void setEventSpies( List eventSpies )
+ {
+ // make copy to get rid of needless overhead for dynamic lookups
+ this.eventSpies = new ArrayList<>( eventSpies );
+ }
+
+ public List getEventSpies()
+ {
+ return eventSpies;
+ }
+
+ public ExecutionListener chainListener( ExecutionListener listener )
+ {
+ if ( eventSpies.isEmpty() )
+ {
+ return listener;
+ }
+ return new EventSpyExecutionListener( this, listener );
+ }
+
+ public RepositoryListener chainListener( RepositoryListener listener )
+ {
+ if ( eventSpies.isEmpty() )
+ {
+ return listener;
+ }
+ return new EventSpyRepositoryListener( this, listener );
+ }
+
+ public void init( EventSpy.Context context )
+ {
+ if ( eventSpies.isEmpty() )
+ {
+ return;
+ }
+ for ( EventSpy eventSpy : eventSpies )
+ {
+ try
+ {
+ eventSpy.init( context );
+ }
+ catch ( Exception | LinkageError e )
+ {
+ logError( "initialize", e, eventSpy );
+ }
+ }
+ }
+
+ public void onEvent( Object event )
+ {
+ if ( eventSpies.isEmpty() )
+ {
+ return;
+ }
+ for ( EventSpy eventSpy : eventSpies )
+ {
+ try
+ {
+ eventSpy.onEvent( event );
+ }
+ catch ( Exception | LinkageError e )
+ {
+ logError( "notify", e, eventSpy );
+ }
+ }
+ }
+
+ public void close()
+ {
+ if ( eventSpies.isEmpty() )
+ {
+ return;
+ }
+ for ( EventSpy eventSpy : eventSpies )
+ {
+ try
+ {
+ eventSpy.close();
+ }
+ catch ( Exception | LinkageError e )
+ {
+ logError( "close", e, eventSpy );
+ }
+ }
+ }
+
+ private void logError( String action, Throwable e, EventSpy spy )
+ {
+ String msg = "Failed to " + action + " spy " + spy.getClass().getName() + ": " + e.getMessage();
+
+ if ( logger.isDebugEnabled() )
+ {
+ logger.warn( msg, e );
+ }
+ else
+ {
+ logger.warn( msg );
+ }
+ }
+
+}
diff --git a/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java b/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java
index 980bc153a297..96031dd30727 100644
--- a/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java
+++ b/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java
@@ -19,131 +19,25 @@
* under the License.
*/
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
import org.apache.maven.eventspy.EventSpy;
import org.apache.maven.execution.ExecutionListener;
-import org.codehaus.plexus.logging.Logger;
import org.eclipse.aether.RepositoryListener;
/**
* Dispatches callbacks to all registered eventspies.
* @since 3.0.2
*/
-@Named
-@Singleton
-public class EventSpyDispatcher
+public interface EventSpyDispatcher
{
- @Inject
- private Logger logger;
-
- private List eventSpies;
-
- @Inject
- public void setEventSpies( List eventSpies )
- {
- // make copy to get rid of needless overhead for dynamic lookups
- this.eventSpies = new ArrayList<>( eventSpies );
- }
-
- public List getEventSpies()
- {
- return eventSpies;
- }
-
- public ExecutionListener chainListener( ExecutionListener listener )
- {
- if ( eventSpies.isEmpty() )
- {
- return listener;
- }
- return new EventSpyExecutionListener( this, listener );
- }
-
- public RepositoryListener chainListener( RepositoryListener listener )
- {
- if ( eventSpies.isEmpty() )
- {
- return listener;
- }
- return new EventSpyRepositoryListener( this, listener );
- }
-
- public void init( EventSpy.Context context )
- {
- if ( eventSpies.isEmpty() )
- {
- return;
- }
- for ( EventSpy eventSpy : eventSpies )
- {
- try
- {
- eventSpy.init( context );
- }
- catch ( Exception | LinkageError e )
- {
- logError( "initialize", e, eventSpy );
- }
- }
- }
+ ExecutionListener chainListener( ExecutionListener listener );
- public void onEvent( Object event )
- {
- if ( eventSpies.isEmpty() )
- {
- return;
- }
- for ( EventSpy eventSpy : eventSpies )
- {
- try
- {
- eventSpy.onEvent( event );
- }
- catch ( Exception | LinkageError e )
- {
- logError( "notify", e, eventSpy );
- }
- }
- }
+ RepositoryListener chainListener( RepositoryListener listener );
- public void close()
- {
- if ( eventSpies.isEmpty() )
- {
- return;
- }
- for ( EventSpy eventSpy : eventSpies )
- {
- try
- {
- eventSpy.close();
- }
- catch ( Exception | LinkageError e )
- {
- logError( "close", e, eventSpy );
- }
- }
- }
+ void init( EventSpy.Context context );
- private void logError( String action, Throwable e, EventSpy spy )
- {
- String msg = "Failed to " + action + " spy " + spy.getClass().getName() + ": " + e.getMessage();
+ void onEvent( Object event );
- if ( logger.isDebugEnabled() )
- {
- logger.warn( msg, e );
- }
- else
- {
- logger.warn( msg );
- }
- }
+ void close();
}
diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
index f8dbb035704f..b40ce8318fc8 100644
--- a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
+++ b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
@@ -34,8 +34,6 @@
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.settings.Settings;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.eclipse.aether.RepositorySystemSession;
/**
@@ -288,12 +286,6 @@ public void setAllProjects( List allProjects )
/*if_not[MAVEN4]*/
- //
- // Deprecated
- //
-
- private PlexusContainer container;
-
private final Settings settings;
@Deprecated
@@ -304,10 +296,9 @@ public Map getProjectMap()
}
@Deprecated
- public MavenSession( PlexusContainer container, RepositorySystemSession repositorySession,
+ public MavenSession( RepositorySystemSession repositorySession,
MavenExecutionRequest request, MavenExecutionResult result )
{
- this.container = container;
this.request = request;
this.result = result;
this.settings = new SettingsAdapter( request );
@@ -315,30 +306,29 @@ public MavenSession( PlexusContainer container, RepositorySystemSession reposito
}
@Deprecated
- public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result,
+ public MavenSession( MavenExecutionRequest request, MavenExecutionResult result,
MavenProject project )
{
- this( container, request, result, Arrays.asList( new MavenProject[]{project} ) );
+ this( request, result, Arrays.asList( new MavenProject[]{project} ) );
}
@Deprecated
@SuppressWarnings( "checkstyle:parameternumber" )
- public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
+ public MavenSession( Settings settings, ArtifactRepository localRepository,
EventDispatcher eventDispatcher, ReactorManager unused, List goals,
String executionRootDir, Properties executionProperties, Date startTime )
{
- this( container, settings, localRepository, eventDispatcher, unused, goals, executionRootDir,
+ this( settings, localRepository, eventDispatcher, unused, goals, executionRootDir,
executionProperties, null, startTime );
}
@Deprecated
@SuppressWarnings( "checkstyle:parameternumber" )
- public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
+ public MavenSession( Settings settings, ArtifactRepository localRepository,
EventDispatcher eventDispatcher, ReactorManager unused, List goals,
String executionRootDir, Properties executionProperties, Properties userProperties,
Date startTime )
{
- this.container = container;
this.settings = settings;
this.executionProperties = executionProperties;
this.request = new DefaultMavenExecutionRequest();
@@ -350,10 +340,9 @@ public MavenSession( PlexusContainer container, Settings settings, ArtifactRepos
}
@Deprecated
- public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result,
+ public MavenSession( MavenExecutionRequest request, MavenExecutionResult result,
List projects )
{
- this.container = container;
this.request = request;
this.result = result;
this.settings = new SettingsAdapter( request );
@@ -404,39 +393,5 @@ public Properties getExecutionProperties()
return executionProperties;
}
- @Deprecated
- public PlexusContainer getContainer()
- {
- return container;
- }
-
- @Deprecated
- public Object lookup( String role )
- throws ComponentLookupException
- {
- return container.lookup( role );
- }
-
- @Deprecated
- public Object lookup( String role, String roleHint )
- throws ComponentLookupException
- {
- return container.lookup( role, roleHint );
- }
-
- @Deprecated
- public List
+
+ org.apache.maven
+ maven-container
+
org.apache.maven
maven-model-builder
@@ -97,6 +101,13 @@ under the License.
true
+
+ org.apache.maven
+ maven-container
+ tests
+ test-jar
+ test
+
org.codehaus.plexus
plexus-testing
diff --git a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java
index 7660616c0528..80ee5d15776e 100644
--- a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java
+++ b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java
@@ -23,10 +23,10 @@
import javax.inject.Inject;
+import org.apache.maven.container.Container;
+import org.apache.maven.container.test.MavenTest;
import org.apache.maven.repository.internal.util.ConsoleRepositoryListener;
import org.apache.maven.repository.internal.util.ConsoleTransferListener;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.testing.PlexusTest;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
@@ -36,14 +36,14 @@
import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
-@PlexusTest
+@MavenTest
public abstract class AbstractRepositoryTestCase
{
@Inject
protected RepositorySystem system;
@Inject
- protected PlexusContainer container;
+ protected Container container;
protected RepositorySystemSession session;
@@ -54,11 +54,12 @@ public void setUp()
session = newMavenRepositorySystemSession( system );
}
- protected PlexusContainer getContainer() {
- return container;
+ protected T lookup( Class role )
+ {
+ return container.lookup( role );
}
- public static RepositorySystemSession newMavenRepositorySystemSession(RepositorySystem system )
+ public static RepositorySystemSession newMavenRepositorySystemSession( RepositorySystem system )
{
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
diff --git a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReaderTest.java b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReaderTest.java
index a68a42f0db37..cd45fe36d94e 100644
--- a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReaderTest.java
+++ b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReaderTest.java
@@ -42,7 +42,7 @@ public void testMng5459()
throws Exception
{
// prepare
- DefaultArtifactDescriptorReader reader = (DefaultArtifactDescriptorReader) getContainer().lookup( ArtifactDescriptorReader.class );
+ DefaultArtifactDescriptorReader reader = (DefaultArtifactDescriptorReader) lookup( ArtifactDescriptorReader.class );
RepositoryEventDispatcher eventDispatcher = mock( RepositoryEventDispatcher.class );
diff --git a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultModelResolverTest.java b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultModelResolverTest.java
index 1a4d444de4c0..1523f69f5d4d 100644
--- a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultModelResolverTest.java
+++ b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/DefaultModelResolverTest.java
@@ -26,7 +26,6 @@
import org.apache.maven.model.Parent;
import org.apache.maven.model.resolution.ModelResolver;
import org.apache.maven.model.resolution.UnresolvableModelException;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.eclipse.aether.impl.ArtifactResolver;
import org.eclipse.aether.impl.RemoteRepositoryManager;
import org.eclipse.aether.impl.VersionRangeResolver;
@@ -199,11 +198,11 @@ public void testResolveDependencySuccessfullyResolvesExistingDependencyUsingHigh
assertEquals( "1.0", dependency.getVersion() );
}
- private ModelResolver newModelResolver() throws ComponentLookupException, MalformedURLException
+ private ModelResolver newModelResolver() throws MalformedURLException
{
return new DefaultModelResolver( this.session, null, this.getClass().getName(),
- getContainer().lookup( ArtifactResolver.class ), getContainer().lookup( VersionRangeResolver.class ),
- getContainer().lookup( RemoteRepositoryManager.class ),
+ lookup( ArtifactResolver.class ), lookup( VersionRangeResolver.class ),
+ lookup( RemoteRepositoryManager.class ),
Arrays.asList( newTestRepository() ) );
}
diff --git a/pom.xml b/pom.xml
index c1bb3036b7d4..f6aaee1f83a5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,6 +82,7 @@ under the License.
maven-bom
maven-plugin-api
maven-builder-support
+ maven-container
maven-model
maven-model-builder
maven-model-transform
@@ -453,6 +454,12 @@ under the License.
${junitVersion}
test
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junitVersion}
+ test
+