forked from apache/maven-resolver
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MRESOLVER-518] Version selector improvements (apache#450)
Version selector improvements: * introduce strategy how to select "winner" (so far it was cemented "nearest") and optionally perform some enforcements * supplier retains same behaviour as before Big fat note: this is NOT to alter Maven4 behaviour, but to make Resolver 2 more versatile for example for "diagnostic purposes" (while Maven may still benefit from these changes as well, by having some "strict version strategy" mode for example). --- https://issues.apache.org/jira/browse/MRESOLVER-518
- Loading branch information
Showing
9 changed files
with
736 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
143 changes: 143 additions & 0 deletions
143
...src/main/java/org/apache/maven/resolver/examples/GetDependencyHierarchyWithConflicts.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
/* | ||
* 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. | ||
*/ | ||
package org.apache.maven.resolver.examples; | ||
|
||
import org.apache.maven.resolver.examples.util.Booter; | ||
import org.eclipse.aether.RepositorySystem; | ||
import org.eclipse.aether.RepositorySystemSession.CloseableSession; | ||
import org.eclipse.aether.RepositorySystemSession.SessionBuilder; | ||
import org.eclipse.aether.artifact.Artifact; | ||
import org.eclipse.aether.artifact.DefaultArtifact; | ||
import org.eclipse.aether.collection.CollectRequest; | ||
import org.eclipse.aether.collection.UnsolvableVersionConflictException; | ||
import org.eclipse.aether.resolution.ArtifactDescriptorRequest; | ||
import org.eclipse.aether.resolution.ArtifactDescriptorResult; | ||
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; | ||
import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer; | ||
import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector; | ||
import org.eclipse.aether.util.graph.transformer.ConflictResolver; | ||
import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner; | ||
import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver; | ||
import org.eclipse.aether.util.graph.transformer.JavaScopeSelector; | ||
import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector; | ||
|
||
/** | ||
* Visualizes the transitive dependencies of an artifact similar to m2e's dependency hierarchy view. | ||
*/ | ||
public class GetDependencyHierarchyWithConflicts { | ||
|
||
/** | ||
* Main. | ||
* @param args | ||
* @throws Exception | ||
*/ | ||
public static void main(String[] args) throws Exception { | ||
System.out.println("------------------------------------------------------------"); | ||
System.out.println(GetDependencyHierarchyWithConflicts.class.getSimpleName()); | ||
|
||
// incompatible versions: two incompatible versions present in graph | ||
try (RepositorySystem system = Booter.newRepositorySystem(Booter.selectFactory(args))) { | ||
SessionBuilder sessionBuilder = Booter.newRepositorySystemSession(system); | ||
sessionBuilder.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true); | ||
sessionBuilder.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true); | ||
try (CloseableSession session = sessionBuilder | ||
.setDependencyGraphTransformer(new ChainedDependencyGraphTransformer( | ||
new ConflictResolver( | ||
new ConfigurableVersionSelector( | ||
new ConfigurableVersionSelector.MajorVersionConvergence( | ||
new ConfigurableVersionSelector.Nearest())), | ||
new JavaScopeSelector(), | ||
new SimpleOptionalitySelector(), | ||
new JavaScopeDeriver()), | ||
new JavaDependencyContextRefiner())) | ||
.build()) { | ||
Artifact artifact = new DefaultArtifact("org.apache.maven.shared:maven-dependency-tree:3.0.1"); | ||
|
||
ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest(); | ||
descriptorRequest.setArtifact(artifact); | ||
descriptorRequest.setRepositories(Booter.newRepositories(system, session)); | ||
ArtifactDescriptorResult descriptorResult = system.readArtifactDescriptor(session, descriptorRequest); | ||
|
||
CollectRequest collectRequest = new CollectRequest(); | ||
collectRequest.setRootArtifact(descriptorResult.getArtifact()); | ||
collectRequest.setDependencies(descriptorResult.getDependencies()); | ||
collectRequest.setManagedDependencies(descriptorResult.getManagedDependencies()); | ||
collectRequest.setRepositories(descriptorRequest.getRepositories()); | ||
|
||
system.collectDependencies(session, collectRequest); | ||
throw new IllegalStateException("should fail"); | ||
} | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
if (e.getCause() instanceof UnsolvableVersionConflictException) { | ||
String cause = e.getCause().getMessage(); | ||
if (!cause.contains( | ||
"Incompatible versions for org.apache.maven:maven-core, incompatible versions: [2.0], all versions [2.0, 3.0.4]")) { | ||
throw new IllegalStateException("should fail due incompatible versions"); | ||
} | ||
} else { | ||
throw new IllegalStateException("should fail due incompatible versions"); | ||
} | ||
} | ||
|
||
// dependency divergence: multiple versions of same GA present in graph | ||
try (RepositorySystem system = Booter.newRepositorySystem(Booter.selectFactory(args))) { | ||
SessionBuilder sessionBuilder = Booter.newRepositorySystemSession(system); | ||
sessionBuilder.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true); | ||
sessionBuilder.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true); | ||
try (CloseableSession session = sessionBuilder | ||
.setDependencyGraphTransformer(new ChainedDependencyGraphTransformer( | ||
new ConflictResolver( | ||
new ConfigurableVersionSelector(new ConfigurableVersionSelector.VersionConvergence( | ||
new ConfigurableVersionSelector.Nearest())), | ||
new JavaScopeSelector(), | ||
new SimpleOptionalitySelector(), | ||
new JavaScopeDeriver()), | ||
new JavaDependencyContextRefiner())) | ||
.build()) { | ||
Artifact artifact = new DefaultArtifact("org.apache.maven.shared:maven-dependency-tree:3.1.0"); | ||
|
||
ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest(); | ||
descriptorRequest.setArtifact(artifact); | ||
descriptorRequest.setRepositories(Booter.newRepositories(system, session)); | ||
ArtifactDescriptorResult descriptorResult = system.readArtifactDescriptor(session, descriptorRequest); | ||
|
||
CollectRequest collectRequest = new CollectRequest(); | ||
collectRequest.setRootArtifact(descriptorResult.getArtifact()); | ||
collectRequest.setDependencies(descriptorResult.getDependencies()); | ||
collectRequest.setManagedDependencies(descriptorResult.getManagedDependencies()); | ||
collectRequest.setRepositories(descriptorRequest.getRepositories()); | ||
|
||
system.collectDependencies(session, collectRequest); | ||
throw new IllegalStateException("should fail"); | ||
} | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
if (e.getCause() instanceof UnsolvableVersionConflictException) { | ||
String cause = e.getCause().getMessage(); | ||
if (!cause.contains( | ||
"Convergence violated for org.codehaus.plexus:plexus-utils, versions present: [2.1, 1.5.5, 2.0.6]")) { | ||
throw new IllegalStateException("should fail due convergence violation"); | ||
} | ||
} else { | ||
throw new IllegalStateException("should fail due convergence violation"); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.