001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.apache.maven.resolver.examples; 020 021import java.util.List; 022 023import org.apache.maven.resolver.examples.util.Booter; 024import org.eclipse.aether.RepositorySystem; 025import org.eclipse.aether.RepositorySystemSession.CloseableSession; 026import org.eclipse.aether.RepositorySystemSession.SessionBuilder; 027import org.eclipse.aether.artifact.DefaultArtifact; 028import org.eclipse.aether.collection.CollectRequest; 029import org.eclipse.aether.collection.CollectResult; 030import org.eclipse.aether.graph.Dependency; 031import org.eclipse.aether.graph.DependencyNode; 032import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector; 033import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; 034import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer; 035import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector; 036import org.eclipse.aether.util.graph.transformer.ConflictResolver; 037import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner; 038import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver; 039import org.eclipse.aether.util.graph.transformer.JavaScopeSelector; 040import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector; 041import org.eclipse.aether.util.graph.visitor.DependencyGraphDumper; 042 043/** 044 * Demo of "nearest" vs "highest" winner selection. 045 */ 046public class GetDependencyHierarchyWithConflictsStrategies { 047 048 /** 049 * Main. 050 * @param args 051 * @throws Exception 052 */ 053 public static void main(String[] args) throws Exception { 054 System.out.println("------------------------------------------------------------"); 055 System.out.println(GetDependencyHierarchyWithConflictsStrategies.class.getSimpleName()); 056 057 CollectRequest collectRequest; 058 059 // okttp cleanly shows difference between nearest/closest 060 collectRequest = new CollectRequest(); 061 collectRequest.setRootArtifact(new DefaultArtifact("demo:demo:1.0")); 062 collectRequest.setDependencies( 063 List.of(new Dependency(new DefaultArtifact("com.squareup.okhttp3:okhttp:jar:4.12.0"), "compile"))); 064 runItWithStrategy(args, ConfigurableVersionSelector.NEAREST_SELECTION_STRATEGY, collectRequest); 065 runItWithStrategy(args, ConfigurableVersionSelector.HIGHEST_SELECTION_STRATEGY, collectRequest); 066 067 // MENFORCER-408 inspired 068 collectRequest = new CollectRequest(); 069 collectRequest.setRootArtifact(new DefaultArtifact("demo:demo:1.0")); 070 collectRequest.setDependencies(List.of( 071 new Dependency(new DefaultArtifact("org.seleniumhq.selenium:selenium-java:jar:3.0.1"), "test"))); 072 collectRequest.setManagedDependencies(List.of( 073 new Dependency(new DefaultArtifact("org.seleniumhq.selenium:selenium-java:jar:3.0.1"), "test"), 074 new Dependency(new DefaultArtifact("org.seleniumhq.selenium:selenium-remote-driver:jar:3.0.1"), "test"), 075 new Dependency(new DefaultArtifact("com.codeborne:phantomjsdriver:jar:1.3.0"), "test"))); 076 runItWithStrategy(args, ConfigurableVersionSelector.NEAREST_SELECTION_STRATEGY, collectRequest); 077 runItWithStrategy(args, ConfigurableVersionSelector.HIGHEST_SELECTION_STRATEGY, collectRequest); 078 } 079 080 private static void runItWithStrategy(String[] args, String selectionStrategy, CollectRequest collectRequest) 081 throws Exception { 082 System.out.println(); 083 System.out.println(selectionStrategy); 084 try (RepositorySystem system = Booter.newRepositorySystem(Booter.selectFactory(args))) { 085 SessionBuilder sessionBuilder = Booter.newRepositorySystemSession(system, Booter.selectFs(args)); 086 sessionBuilder.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, ConflictResolver.Verbosity.STANDARD); 087 sessionBuilder.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true); 088 sessionBuilder.setConfigProperty( 089 ConfigurableVersionSelector.CONFIG_PROP_SELECTION_STRATEGY, selectionStrategy); 090 sessionBuilder.setConfigProperty( 091 BfDependencyCollector.CONFIG_PROP_SKIPPER, BfDependencyCollector.VERSIONED_SKIPPER); 092 try (CloseableSession session = sessionBuilder 093 .setDependencyGraphTransformer(new ChainedDependencyGraphTransformer( 094 new ConflictResolver( 095 new ConfigurableVersionSelector(), 096 new JavaScopeSelector(), 097 new SimpleOptionalitySelector(), 098 new JavaScopeDeriver()), 099 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}