You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/04/08 08:30:14 UTC
[maven] branch maven-3.8.x updated: [MNG-7432] Resolver session contains non-MavenWorkspaceReader (#695)
This is an automated email from the ASF dual-hosted git repository.
cstamas pushed a commit to branch maven-3.8.x
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/maven-3.8.x by this push:
new 957b5e312 [MNG-7432] Resolver session contains non-MavenWorkspaceReader (#695)
957b5e312 is described below
commit 957b5e312f4a580701985227577c2637f0a548b8
Author: Christoph Läubrich <ma...@laeubi-soft.de>
AuthorDate: Fri Apr 8 10:30:07 2022 +0200
[MNG-7432] Resolver session contains non-MavenWorkspaceReader (#695)
As Resolver session contains non-MavenWorkspaceReader, the reactor models (already resolved w/ profiles applied) are re-built when using Resolver within Mojo, instead to get them via ReactorReader as expected. The rebuilt models will lack explicit (-P on CLI) profiles applied, as resolver itself is not maven aware, hence there is no way to "tell" resolver to apply them. Building reactor models w/ profiles applied is NOT done using resolver, but by Maven when loading up reactor, as pro [...]
Signed-off-by: Christoph Läubrich <ch...@laeubi-soft.de>
Co-authored-by: Christoph Läubrich <ch...@laeubi-soft.de>
Co-authored-by: Tamas Cservenak <ta...@cservenak.net>
---
.../main/java/org/apache/maven/DefaultMaven.java | 6 +-
.../aether/MavenChainedWorkspaceReader.java | 106 +++++++++++++++++++++
.../java/org/apache/maven/DefaultMavenTest.java | 29 ++++++
.../src/test/projects/default-maven/simple/pom.xml | 10 ++
4 files changed, 147 insertions(+), 4 deletions(-)
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 12b8f4ac7..f487b88fe 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -40,6 +40,7 @@ import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ProjectDependencyGraph;
import org.apache.maven.graph.GraphBuilder;
import org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory;
+import org.apache.maven.internal.aether.MavenChainedWorkspaceReader;
import org.apache.maven.lifecycle.internal.ExecutionEventCatapult;
import org.apache.maven.lifecycle.internal.LifecycleStarter;
import org.apache.maven.model.Prerequisites;
@@ -58,7 +59,6 @@ import org.codehaus.plexus.logging.Logger;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.repository.WorkspaceReader;
-import org.eclipse.aether.util.repository.ChainedWorkspaceReader;
/**
* @author Jason van Zyl
@@ -338,9 +338,7 @@ public class DefaultMaven
}
workspaceReaders.add( workspaceReader );
}
- WorkspaceReader[] readers = workspaceReaders.toArray( new WorkspaceReader[0] );
- repoSession.setWorkspaceReader( new ChainedWorkspaceReader( readers ) );
-
+ repoSession.setWorkspaceReader( MavenChainedWorkspaceReader.of( workspaceReaders ) );
}
private void afterSessionEnd( Collection<MavenProject> projects, MavenSession session )
diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/MavenChainedWorkspaceReader.java b/maven-core/src/main/java/org/apache/maven/internal/aether/MavenChainedWorkspaceReader.java
new file mode 100644
index 000000000..4bc16a927
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/MavenChainedWorkspaceReader.java
@@ -0,0 +1,106 @@
+package org.apache.maven.internal.aether;
+
+/*
+ * 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.Collection;
+import java.util.List;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.repository.internal.MavenWorkspaceReader;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.repository.WorkspaceReader;
+import org.eclipse.aether.repository.WorkspaceRepository;
+import org.eclipse.aether.util.repository.ChainedWorkspaceReader;
+
+/**
+ * A maven workspace reader that delegates to a chain of other readers, effectively aggregating their contents.
+ */
+public final class MavenChainedWorkspaceReader
+ implements MavenWorkspaceReader
+{
+
+ private ChainedWorkspaceReader delegate;
+
+ private WorkspaceReader[] readers;
+
+ /**
+ * Creates a new workspace reader by chaining the specified readers.
+ *
+ * @param readers The readers to chain must not be {@code null}.
+ */
+ private MavenChainedWorkspaceReader( WorkspaceReader... readers )
+ {
+ this.delegate = new ChainedWorkspaceReader( readers );
+ this.readers = readers;
+ }
+
+ @Override
+ public Model findModel( Artifact artifact )
+ {
+ for ( WorkspaceReader workspaceReader : readers )
+ {
+ if ( workspaceReader instanceof MavenWorkspaceReader )
+ {
+ Model model = ( (MavenWorkspaceReader) workspaceReader ).findModel( artifact );
+ if ( model != null )
+ {
+ return model;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public WorkspaceRepository getRepository()
+ {
+ return delegate.getRepository();
+ }
+
+ @Override
+ public File findArtifact( Artifact artifact )
+ {
+ return delegate.findArtifact( artifact );
+ }
+
+ @Override
+ public List<String> findVersions( Artifact artifact )
+ {
+ return delegate.findVersions( artifact );
+ }
+
+ /**
+ * chains a collection of {@link WorkspaceReader}s
+ * @param workspaceReaderCollection the collection of readers, might be empty but never <code>null</code>
+ * @return if the collection contains only one item returns the single item, otherwise creates a new
+ * {@link MavenChainedWorkspaceReader} chaining all readers in the order of the given collection.
+ */
+ public static WorkspaceReader of( Collection<WorkspaceReader> workspaceReaderCollection )
+ {
+ WorkspaceReader[] readers = workspaceReaderCollection.toArray( new WorkspaceReader[0] );
+ if ( readers.length == 1 )
+ {
+ return readers[0];
+ }
+ return new MavenChainedWorkspaceReader( readers );
+ }
+
+}
diff --git a/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java b/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java
index 1360d8e62..a0a0b92b4 100644
--- a/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java
+++ b/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java
@@ -4,11 +4,15 @@ import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionResult;
+import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.repository.internal.MavenWorkspaceReader;
+import org.codehaus.plexus.component.annotations.Component;
import java.io.File;
import java.nio.file.Files;
+import java.util.concurrent.atomic.AtomicReference;
import static java.util.Arrays.asList;
@@ -33,6 +37,31 @@ import static java.util.Arrays.asList;
public class DefaultMavenTest
extends AbstractCoreMavenComponentTestCase
{
+ @Component( role = AbstractMavenLifecycleParticipant.class, hint = "WsrClassCatcher" )
+ private static final class WsrClassCatcher extends AbstractMavenLifecycleParticipant
+ {
+ private final AtomicReference<Class<?>> wsrClassRef = new AtomicReference<>( null );
+
+ @Override
+ public void afterProjectsRead( MavenSession session ) throws MavenExecutionException
+ {
+ wsrClassRef.set( session.getRepositorySession().getWorkspaceReader().getClass() );
+ }
+ }
+
+ public void testEnsureResolverSessionHasMavenWorkspaceReader() throws Exception
+ {
+ WsrClassCatcher wsrClassCatcher = ( WsrClassCatcher ) getContainer()
+ .lookup( AbstractMavenLifecycleParticipant.class, "WsrClassCatcher" );
+ Maven maven = getContainer().lookup( Maven.class );
+ MavenExecutionRequest request = createMavenExecutionRequest( getProject( "simple" ) ).setGoals( asList("validate") );
+
+ MavenExecutionResult result = maven.execute( request );
+
+ Class<?> wsrClass = wsrClassCatcher.wsrClassRef.get();
+ assertTrue( "is null", wsrClass != null );
+ assertTrue( String.valueOf( wsrClass ), MavenWorkspaceReader.class.isAssignableFrom( wsrClass ) );
+ }
public void testThatErrorDuringProjectDependencyGraphCreationAreStored()
throws Exception
diff --git a/maven-core/src/test/projects/default-maven/simple/pom.xml b/maven-core/src/test/projects/default-maven/simple/pom.xml
new file mode 100644
index 000000000..0221f8208
--- /dev/null
+++ b/maven-core/src/test/projects/default-maven/simple/pom.xml
@@ -0,0 +1,10 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>simple</groupId>
+ <artifactId>simple</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+</project>