View Javadoc
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.apache.maven.resolver.examples;
20  
21  import java.util.List;
22  
23  import org.apache.maven.resolver.examples.util.Booter;
24  import org.eclipse.aether.RepositorySystem;
25  import org.eclipse.aether.RepositorySystemSession.CloseableSession;
26  import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
27  import org.eclipse.aether.artifact.DefaultArtifact;
28  import org.eclipse.aether.collection.CollectRequest;
29  import org.eclipse.aether.collection.CollectResult;
30  import org.eclipse.aether.graph.Dependency;
31  import org.eclipse.aether.graph.DependencyNode;
32  import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector;
33  import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
34  import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
35  import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector;
36  import org.eclipse.aether.util.graph.transformer.ConflictResolver;
37  import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
38  import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
39  import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
40  import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
41  import org.eclipse.aether.util.graph.visitor.DependencyGraphDumper;
42  
43  /**
44   * Demo of "nearest" vs "highest" winner selection.
45   */
46  public class GetDependencyHierarchyWithConflictsStrategies {
47  
48      /**
49       * Main.
50       * @param args
51       * @throws Exception
52       */
53      public static void main(String[] args) throws Exception {
54          System.out.println("------------------------------------------------------------");
55          System.out.println(GetDependencyHierarchyWithConflictsStrategies.class.getSimpleName());
56  
57          CollectRequest collectRequest;
58  
59          // okttp cleanly shows difference between nearest/closest
60          collectRequest = new CollectRequest();
61          collectRequest.setRootArtifact(new DefaultArtifact("demo:demo:1.0"));
62          collectRequest.setDependencies(
63                  List.of(new Dependency(new DefaultArtifact("com.squareup.okhttp3:okhttp:jar:4.12.0"), "compile")));
64          runItWithStrategy(args, ConfigurableVersionSelector.NEAREST_SELECTION_STRATEGY, collectRequest);
65          runItWithStrategy(args, ConfigurableVersionSelector.HIGHEST_SELECTION_STRATEGY, collectRequest);
66  
67          // MENFORCER-408 inspired
68          collectRequest = new CollectRequest();
69          collectRequest.setRootArtifact(new DefaultArtifact("demo:demo:1.0"));
70          collectRequest.setDependencies(List.of(
71                  new Dependency(new DefaultArtifact("org.seleniumhq.selenium:selenium-java:jar:3.0.1"), "test")));
72          collectRequest.setManagedDependencies(List.of(
73                  new Dependency(new DefaultArtifact("org.seleniumhq.selenium:selenium-java:jar:3.0.1"), "test"),
74                  new Dependency(new DefaultArtifact("org.seleniumhq.selenium:selenium-remote-driver:jar:3.0.1"), "test"),
75                  new Dependency(new DefaultArtifact("com.codeborne:phantomjsdriver:jar:1.3.0"), "test")));
76          runItWithStrategy(args, ConfigurableVersionSelector.NEAREST_SELECTION_STRATEGY, collectRequest);
77          runItWithStrategy(args, ConfigurableVersionSelector.HIGHEST_SELECTION_STRATEGY, collectRequest);
78      }
79  
80      private static void runItWithStrategy(String[] args, String selectionStrategy, CollectRequest collectRequest)
81              throws Exception {
82          System.out.println();
83          System.out.println(selectionStrategy);
84          try (RepositorySystem system = Booter.newRepositorySystem(Booter.selectFactory(args))) {
85              SessionBuilder sessionBuilder = Booter.newRepositorySystemSession(system, Booter.selectFs(args));
86              sessionBuilder.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, ConflictResolver.Verbosity.STANDARD);
87              sessionBuilder.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true);
88              sessionBuilder.setConfigProperty(
89                      ConfigurableVersionSelector.CONFIG_PROP_SELECTION_STRATEGY, selectionStrategy);
90              sessionBuilder.setConfigProperty(
91                      BfDependencyCollector.CONFIG_PROP_SKIPPER, BfDependencyCollector.VERSIONED_SKIPPER);
92              try (CloseableSession session = sessionBuilder
93                      .setDependencyGraphTransformer(new ChainedDependencyGraphTransformer(
94                              new ConflictResolver(
95                                      new ConfigurableVersionSelector(),
96                                      new JavaScopeSelector(),
97                                      new SimpleOptionalitySelector(),
98                                      new JavaScopeDeriver()),
99                              new JavaDependencyContextRefiner()))
100                     .setRepositoryListener(null)
101                     .setTransferListener(null)
102                     .build()) {
103 
104                 collectRequest.setRepositories(Booter.newRepositories(system, session));
105 
106                 CollectResult result = system.collectDependencies(session, collectRequest);
107                 System.out.println("tree:");
108                 result.getRoot().accept(new DependencyGraphDumper(System.out::println));
109 
110                 List<DependencyNode> selected =
111                         system.flattenDependencyNodes(session, result.getRoot(), (node, parents) -> !node.getData()
112                                 .containsKey(ConflictResolver.NODE_DATA_WINNER));
113                 System.out.println("cp:");
114                 selected.forEach(System.out::println);
115             }
116         }
117     }
118 }