如何在Aether的collectDependencies方法中排除依赖
问题根因
你在CollectRequest的顶层根依赖上配置的Exclusion规则不会生效。Maven的exclusion规则设计上仅作用于非顶层的传递依赖,用于排除该依赖被父节点引入时附带的传递依赖,不会对根节点自身的传递依赖解析生效。
解决方案
方案1:包装虚拟根节点触发exclusion规则
新增一个无传递依赖的虚拟根Artifact,将你的目标依赖作为虚拟根的子依赖挂载,此时给子依赖配置的exclusion规则就会正常生效,代码示例如下:
RepositorySystem system = Booter.newRepositorySystem(Booter.selectFactory(args)); RepositorySystemSession session = Booter.newRepositorySystemSession(system); Artifact artifact1 = new DefaultArtifact("com.google.oauth-client:google-oauth-client:1.31.5"); Exclusion exclusion = new Exclusion("*", "*", null, null); // 构造无传递依赖的虚拟根构件 Artifact dummyRoot = new DefaultArtifact("test:dummy-root:1.0"); CollectRequest collectRequest = new CollectRequest(); collectRequest.setRepositories(Booter.newRepositories(system, session)); // 将目标依赖作为虚拟根的依赖传入,exclusion规则会正常生效 collectRequest.setDependencies(List.of( new Dependency(dummyRoot, ""), new Dependency(artifact1, "", false, Set.of(exclusion)) )); CollectResult collectResult = system.collectDependencies(session, collectRequest); // 跳过虚拟根节点,直接打印目标依赖的树结构 collectResult.getRoot().getChildren().get(0).accept(new ConsoleDependencyGraphDumper());
方案2:自定义依赖选择器过滤传递依赖
如果你只是需要排除根依赖的所有传递依赖,不需要使用exclusion规则,直接在会话层面自定义依赖选择器过滤即可,实现更简洁高效:
RepositorySystem system = Booter.newRepositorySystem(Booter.selectFactory(args)); // 基于默认session扩展,添加自定义依赖选择器 DefaultRepositorySystemSession session = new DefaultRepositorySystemSession(Booter.newRepositorySystemSession(system)); session.setDependencySelector(new DependencySelector() { @Override public boolean selectDependency(Dependency dependency) { // 保留根节点 return true; } @Override public DependencySelector deriveChildSelector(DependencyGraphTransformationContext context) { // 所有子节点(传递依赖)全部排除 return dependency -> false; } }); Artifact artifact1 = new DefaultArtifact("com.google.oauth-client:google-oauth-client:1.31.5"); CollectRequest collectRequest = new CollectRequest(); collectRequest.setRepositories(Booter.newRepositories(system, session)); collectRequest.setDependencies(List.of(new Dependency(artifact1, ""))); CollectResult collectResult = system.collectDependencies(session, collectRequest); collectResult.getRoot().accept(new ConsoleDependencyGraphDumper());
内容的提问来源于stack exchange,提问作者sleeping
相关产品推荐
相关产品推荐

