You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 20:15:00