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 runItWithStrategy(args, ConfigurableVersionSelector.NEAREST_SELECTION_STRATEGY); 058 runItWithStrategy(args, ConfigurableVersionSelector.HIGHEST_SELECTION_STRATEGY); 059 } 060 061 private static void runItWithStrategy(String[] args, String selectionStrategy) throws Exception { 062 System.out.println(); 063 System.out.println(selectionStrategy); 064 try (RepositorySystem system = Booter.newRepositorySystem(Booter.selectFactory(args))) { 065 SessionBuilder sessionBuilder = Booter.newRepositorySystemSession(system); 066 sessionBuilder.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, ConflictResolver.Verbosity.FULL); 067 sessionBuilder.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true); 068 sessionBuilder.setConfigProperty( 069 ConfigurableVersionSelector.CONFIG_PROP_SELECTION_STRATEGY, selectionStrategy); 070 sessionBuilder.setConfigProperty( 071 BfDependencyCollector.CONFIG_PROP_SKIPPER, BfDependencyCollector.VERSIONED_SKIPPER); 072 try (CloseableSession session = sessionBuilder 073 .setDependencyGraphTransformer(new ChainedDependencyGraphTransformer( 074 new ConflictResolver( 075 new ConfigurableVersionSelector(), 076 new JavaScopeSelector(), 077 new SimpleOptionalitySelector(), 078 new JavaScopeDeriver()), 079 new JavaDependencyContextRefiner())) 080 .setRepositoryListener(null) 081 .setTransferListener(null) 082 .build()) { 083 084 CollectRequest collectRequest = new CollectRequest(); 085 collectRequest.setRootArtifact(new DefaultArtifact("demo:demo:1.0")); 086 collectRequest.setDependencies(List.of( 087 new Dependency(new DefaultArtifact("com.squareup.okhttp3:okhttp:jar:4.12.0"), "compile"))); 088 collectRequest.setRepositories(Booter.newRepositories(system, session)); 089 090 CollectResult result = system.collectDependencies(session, collectRequest); 091 System.out.println("tree:"); 092 result.getRoot().accept(new DependencyGraphDumper(System.out::println)); 093 094 List<DependencyNode> selected = 095 system.flattenDependencyNodes(session, result.getRoot(), (node, parents) -> !node.getData() 096 .containsKey(ConflictResolver.NODE_DATA_WINNER)); 097 System.out.println("cp:"); 098 selected.forEach(System.out::println); 099 } 100 } 101 } 102}