From 957b5e312f4a580701985227577c2637f0a548b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Fri, 8 Apr 2022 10:30:07 +0200 Subject: [PATCH] [MNG-7432] Resolver session contains non-MavenWorkspaceReader (#695) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 profiles are NOT applied for downstream transitive dependencies (see discussion on MNG-1388 why). Signed-off-by: Christoph Läubrich Co-authored-by: Christoph Läubrich Co-authored-by: Tamas Cservenak --- .../java/org/apache/maven/DefaultMaven.java | 6 +- .../aether/MavenChainedWorkspaceReader.java | 106 ++++++++++++++++++ .../org/apache/maven/DefaultMavenTest.java | 29 +++++ .../projects/default-maven/simple/pom.xml | 10 ++ 4 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 maven-core/src/main/java/org/apache/maven/internal/aether/MavenChainedWorkspaceReader.java create mode 100644 maven-core/src/test/projects/default-maven/simple/pom.xml 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 12b8f4ac7b4..f487b88fef2 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.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.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 @@ private void setupWorkspaceReader( MavenSession session, DefaultRepositorySystem } workspaceReaders.add( workspaceReader ); } - WorkspaceReader[] readers = workspaceReaders.toArray( new WorkspaceReader[0] ); - repoSession.setWorkspaceReader( new ChainedWorkspaceReader( readers ) ); - + repoSession.setWorkspaceReader( MavenChainedWorkspaceReader.of( workspaceReaders ) ); } private void afterSessionEnd( Collection 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 00000000000..4bc16a9271c --- /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 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 null + * @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 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 1360d8e6231..a0a0b92b449 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.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 @@ public class DefaultMavenTest extends AbstractCoreMavenComponentTestCase { + @Component( role = AbstractMavenLifecycleParticipant.class, hint = "WsrClassCatcher" ) + private static final class WsrClassCatcher extends AbstractMavenLifecycleParticipant + { + private final AtomicReference> 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 00000000000..0221f8208f2 --- /dev/null +++ b/maven-core/src/test/projects/default-maven/simple/pom.xml @@ -0,0 +1,10 @@ + + 4.0.0 + + simple + simple + 1.0-SNAPSHOT + pom + +