Skip to content

Commit 3414d62

Browse files
authored
Resolver 2 provides scope manager for mvn3 (#1568)
As Maven3 is now mature, set in stone, so Resolver 2 can do it. Same for Maven4 is not possible (is like chicken-egg situation). Presence of scope manager allows now new v 2.0 features like "resolving by ResolutionScope", so no need for manual setting up selection of session and filter parameters to achieve wanted effect: just say what scope you want and bam, there it is.
1 parent 1d5085d commit 3414d62

File tree

3 files changed

+209
-9
lines changed

3 files changed

+209
-9
lines changed
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.eclipse.aether.supplier;
20+
21+
import java.util.ArrayList;
22+
import java.util.Arrays;
23+
import java.util.Collection;
24+
import java.util.Collections;
25+
import java.util.stream.Collectors;
26+
27+
import org.eclipse.aether.artifact.ArtifactProperties;
28+
import org.eclipse.aether.impl.scope.BuildScopeMatrixSource;
29+
import org.eclipse.aether.impl.scope.BuildScopeSource;
30+
import org.eclipse.aether.impl.scope.CommonBuilds;
31+
import org.eclipse.aether.impl.scope.InternalScopeManager;
32+
import org.eclipse.aether.impl.scope.ScopeManagerConfiguration;
33+
import org.eclipse.aether.internal.impl.scope.ScopeManagerDump;
34+
import org.eclipse.aether.scope.DependencyScope;
35+
import org.eclipse.aether.scope.ResolutionScope;
36+
37+
import static org.eclipse.aether.impl.scope.BuildScopeQuery.all;
38+
import static org.eclipse.aether.impl.scope.BuildScopeQuery.byBuildPath;
39+
import static org.eclipse.aether.impl.scope.BuildScopeQuery.byProjectPath;
40+
import static org.eclipse.aether.impl.scope.BuildScopeQuery.select;
41+
import static org.eclipse.aether.impl.scope.BuildScopeQuery.singleton;
42+
import static org.eclipse.aether.impl.scope.BuildScopeQuery.union;
43+
44+
/**
45+
* Maven3 scope configurations. Configures scope manager to support Maven3 scopes.
46+
*
47+
* @since 2.0.11
48+
*/
49+
public final class Maven3ScopeManagerConfiguration implements ScopeManagerConfiguration {
50+
public static final Maven3ScopeManagerConfiguration INSTANCE = new Maven3ScopeManagerConfiguration();
51+
public static final String DS_COMPILE = "compile";
52+
public static final String DS_RUNTIME = "runtime";
53+
public static final String DS_PROVIDED = "provided";
54+
public static final String DS_SYSTEM = "system";
55+
public static final String DS_TEST = "test";
56+
public static final String RS_NONE = "none";
57+
public static final String RS_MAIN_COMPILE = "main-compile";
58+
public static final String RS_MAIN_COMPILE_PLUS_RUNTIME = "main-compilePlusRuntime";
59+
public static final String RS_MAIN_RUNTIME = "main-runtime";
60+
public static final String RS_MAIN_RUNTIME_PLUS_SYSTEM = "main-runtimePlusSystem";
61+
public static final String RS_TEST_COMPILE = "test-compile";
62+
public static final String RS_TEST_RUNTIME = "test-runtime";
63+
64+
private Maven3ScopeManagerConfiguration() {}
65+
66+
@Override
67+
public String getId() {
68+
return "Maven3";
69+
}
70+
71+
@Override
72+
public boolean isStrictDependencyScopes() {
73+
return false;
74+
}
75+
76+
@Override
77+
public boolean isStrictResolutionScopes() {
78+
return false;
79+
}
80+
81+
@Override
82+
public BuildScopeSource getBuildScopeSource() {
83+
return new BuildScopeMatrixSource(
84+
Collections.singletonList(CommonBuilds.PROJECT_PATH_MAIN),
85+
Arrays.asList(CommonBuilds.BUILD_PATH_COMPILE, CommonBuilds.BUILD_PATH_RUNTIME),
86+
CommonBuilds.MAVEN_TEST_BUILD_SCOPE);
87+
}
88+
89+
@Override
90+
public Collection<DependencyScope> buildDependencyScopes(InternalScopeManager internalScopeManager) {
91+
ArrayList<DependencyScope> result = new ArrayList<>();
92+
result.add(internalScopeManager.createDependencyScope(DS_COMPILE, true, all()));
93+
result.add(internalScopeManager.createDependencyScope(
94+
DS_RUNTIME, true, byBuildPath(CommonBuilds.BUILD_PATH_RUNTIME)));
95+
result.add(internalScopeManager.createDependencyScope(
96+
DS_PROVIDED,
97+
false,
98+
union(
99+
byBuildPath(CommonBuilds.BUILD_PATH_COMPILE),
100+
select(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_RUNTIME))));
101+
result.add(internalScopeManager.createDependencyScope(
102+
DS_TEST, false, byProjectPath(CommonBuilds.PROJECT_PATH_TEST)));
103+
result.add(internalScopeManager.createSystemDependencyScope(
104+
DS_SYSTEM, false, all(), ArtifactProperties.LOCAL_PATH));
105+
return result;
106+
}
107+
108+
@Override
109+
public Collection<ResolutionScope> buildResolutionScopes(InternalScopeManager internalScopeManager) {
110+
Collection<DependencyScope> allDependencyScopes = internalScopeManager.getDependencyScopeUniverse();
111+
Collection<DependencyScope> nonTransitiveDependencyScopes =
112+
allDependencyScopes.stream().filter(s -> !s.isTransitive()).collect(Collectors.toSet());
113+
DependencyScope system =
114+
internalScopeManager.getDependencyScope(DS_SYSTEM).orElse(null);
115+
116+
ArrayList<ResolutionScope> result = new ArrayList<>();
117+
result.add(internalScopeManager.createResolutionScope(
118+
RS_NONE,
119+
InternalScopeManager.Mode.REMOVE,
120+
Collections.emptySet(),
121+
Collections.emptySet(),
122+
allDependencyScopes));
123+
result.add(internalScopeManager.createResolutionScope(
124+
RS_MAIN_COMPILE,
125+
InternalScopeManager.Mode.ELIMINATE,
126+
singleton(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.BUILD_PATH_COMPILE),
127+
Collections.singletonList(system),
128+
nonTransitiveDependencyScopes));
129+
result.add(internalScopeManager.createResolutionScope(
130+
RS_MAIN_COMPILE_PLUS_RUNTIME,
131+
InternalScopeManager.Mode.ELIMINATE,
132+
byProjectPath(CommonBuilds.PROJECT_PATH_MAIN),
133+
Collections.singletonList(system),
134+
nonTransitiveDependencyScopes));
135+
result.add(internalScopeManager.createResolutionScope(
136+
RS_MAIN_RUNTIME,
137+
InternalScopeManager.Mode.ELIMINATE,
138+
singleton(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.BUILD_PATH_RUNTIME),
139+
Collections.emptySet(),
140+
nonTransitiveDependencyScopes));
141+
result.add(internalScopeManager.createResolutionScope(
142+
RS_MAIN_RUNTIME_PLUS_SYSTEM,
143+
InternalScopeManager.Mode.ELIMINATE,
144+
singleton(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.BUILD_PATH_RUNTIME),
145+
Collections.singletonList(system),
146+
nonTransitiveDependencyScopes));
147+
result.add(internalScopeManager.createResolutionScope(
148+
RS_TEST_COMPILE,
149+
InternalScopeManager.Mode.ELIMINATE,
150+
select(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_COMPILE),
151+
Collections.singletonList(system),
152+
nonTransitiveDependencyScopes));
153+
result.add(internalScopeManager.createResolutionScope(
154+
RS_TEST_RUNTIME,
155+
InternalScopeManager.Mode.ELIMINATE,
156+
select(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_RUNTIME),
157+
Collections.singletonList(system),
158+
nonTransitiveDependencyScopes));
159+
return result;
160+
}
161+
162+
// ===
163+
164+
public static void main(String... args) {
165+
ScopeManagerDump.dump(Maven3ScopeManagerConfiguration.INSTANCE);
166+
}
167+
}

maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/SessionBuilderSupplier.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,19 @@
3232
import org.eclipse.aether.collection.DependencyManager;
3333
import org.eclipse.aether.collection.DependencySelector;
3434
import org.eclipse.aether.collection.DependencyTraverser;
35+
import org.eclipse.aether.internal.impl.scope.ManagedDependencyContextRefiner;
36+
import org.eclipse.aether.internal.impl.scope.ManagedScopeDeriver;
37+
import org.eclipse.aether.internal.impl.scope.ManagedScopeSelector;
3538
import org.eclipse.aether.internal.impl.scope.OptionalDependencySelector;
3639
import org.eclipse.aether.internal.impl.scope.ScopeDependencySelector;
40+
import org.eclipse.aether.internal.impl.scope.ScopeManagerImpl;
3741
import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
3842
import org.eclipse.aether.util.artifact.DefaultArtifactTypeRegistry;
39-
import org.eclipse.aether.util.artifact.JavaScopes;
4043
import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
4144
import org.eclipse.aether.util.graph.selector.AndDependencySelector;
4245
import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
4346
import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
4447
import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector;
45-
import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
46-
import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
47-
import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
4848
import org.eclipse.aether.util.graph.transformer.PathConflictResolver;
4949
import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
5050
import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
@@ -65,9 +65,11 @@
6565
*/
6666
public class SessionBuilderSupplier implements Supplier<SessionBuilder> {
6767
protected final RepositorySystem repositorySystem;
68+
protected final ScopeManagerImpl scopeManager;
6869

6970
public SessionBuilderSupplier(RepositorySystem repositorySystem) {
7071
this.repositorySystem = requireNonNull(repositorySystem);
72+
this.scopeManager = new ScopeManagerImpl(Maven3ScopeManagerConfiguration.INSTANCE);
7173
}
7274

7375
protected void configureSessionBuilder(SessionBuilder session) {
@@ -77,6 +79,7 @@ protected void configureSessionBuilder(SessionBuilder session) {
7779
key = "env." + (caseSensitive ? key : key.toUpperCase(Locale.ENGLISH));
7880
session.setSystemProperty(key, value);
7981
});
82+
session.setScopeManager(scopeManager);
8083
session.setDependencyTraverser(getDependencyTraverser());
8184
session.setDependencyManager(getDependencyManager());
8285
session.setDependencySelector(getDependencySelector());
@@ -90,22 +93,25 @@ protected DependencyTraverser getDependencyTraverser() {
9093
}
9194

9295
protected DependencyManager getDependencyManager() {
93-
return new ClassicDependencyManager(false, null);
96+
return new ClassicDependencyManager(false, scopeManager);
9497
}
9598

9699
protected DependencySelector getDependencySelector() {
97100
return new AndDependencySelector(
98-
ScopeDependencySelector.legacy(null, Arrays.asList(JavaScopes.TEST, JavaScopes.PROVIDED)),
101+
ScopeDependencySelector.legacy(
102+
null,
103+
Arrays.asList(
104+
Maven3ScopeManagerConfiguration.DS_TEST, Maven3ScopeManagerConfiguration.DS_PROVIDED)),
99105
OptionalDependencySelector.fromDirect(),
100106
new ExclusionDependencySelector());
101107
}
102108

103109
protected DependencyGraphTransformer getDependencyGraphTransformer() {
104110
return new ChainedDependencyGraphTransformer(
105111
new PathConflictResolver(
106-
new ConfigurableVersionSelector(), new JavaScopeSelector(),
107-
new SimpleOptionalitySelector(), new JavaScopeDeriver()),
108-
new JavaDependencyContextRefiner());
112+
new ConfigurableVersionSelector(), new ManagedScopeSelector(scopeManager),
113+
new SimpleOptionalitySelector(), new ManagedScopeDeriver(scopeManager)),
114+
new ManagedDependencyContextRefiner(scopeManager));
109115
}
110116

111117
protected ArtifactTypeRegistry getArtifactTypeRegistry() {

maven-resolver-supplier-mvn3/src/test/java/org/eclipse/aether/supplier/RepositorySystemSupplierTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,15 @@
2626
import org.eclipse.aether.RepositorySystemSession.CloseableSession;
2727
import org.eclipse.aether.artifact.Artifact;
2828
import org.eclipse.aether.artifact.DefaultArtifact;
29+
import org.eclipse.aether.collection.CollectRequest;
30+
import org.eclipse.aether.collection.CollectResult;
31+
import org.eclipse.aether.graph.Dependency;
2932
import org.eclipse.aether.impl.Deployer;
3033
import org.eclipse.aether.repository.RemoteRepository;
3134
import org.eclipse.aether.resolution.VersionRangeRequest;
3235
import org.eclipse.aether.resolution.VersionRangeResult;
3336
import org.eclipse.aether.spi.io.PathProcessor;
37+
import org.eclipse.aether.util.graph.visitor.DependencyGraphDumper;
3438
import org.eclipse.aether.version.Version;
3539
import org.junit.jupiter.api.Test;
3640

@@ -59,6 +63,29 @@ void smoke() throws Exception {
5963
}
6064
}
6165

66+
@Test
67+
void smokeV2Feature() throws Exception {
68+
try (RepositorySystem system = new RepositorySystemSupplier().get();
69+
CloseableSession session = new SessionBuilderSupplier(system)
70+
.get()
71+
.withLocalRepositoryBaseDirectories(new File("target/local-repo").toPath())
72+
.build()) {
73+
CollectRequest collectRequest = new CollectRequest();
74+
collectRequest.setResolutionScope(session.getScopeManager()
75+
.getResolutionScope(Maven3ScopeManagerConfiguration.RS_TEST_RUNTIME)
76+
.orElseThrow(AssertionError::new));
77+
collectRequest.setRoot(
78+
new Dependency(new DefaultArtifact("org.apache.maven:maven-resolver-provider:3.6.1"), ""));
79+
collectRequest.setRepositories(Collections.singletonList(
80+
new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2/")
81+
.build()));
82+
83+
CollectResult collectResult = system.collectDependencies(session, collectRequest);
84+
85+
collectResult.getRoot().accept(new DependencyGraphDumper(System.out::println));
86+
}
87+
}
88+
6289
@Test
6390
void closed() {
6491
RepositorySystemSupplier systemSupplier = new RepositorySystemSupplier();

0 commit comments

Comments
 (0)