Maven 3插件开发:如何读取其他项目的可选依赖
Maven插件开发:正确读取依赖的可选依赖(Optional/Provided)
我正在开发一款Maven插件,核心功能是验证指定依赖的所有可选依赖(包括标记为optional或provided的依赖)是否已被当前项目声明。举个例子:如果项目A依赖项目B,而B的pom.xml里有标记为optional或provided的依赖C,插件需要检测项目A是否显式声明了C,若未声明则抛出错误。
目前在读取其他依赖的可选依赖时遇到了问题,尝试两种方式均存在缺陷:
方式1:通过DependencyNode获取结果始终为空
这段代码试图从依赖节点的子节点中筛选可选依赖,但返回结果一直是空列表:List<DependencyNode> option1Artifacts = visitor.getNodes().stream() .filter(node -> groupIds.contains(node.getArtifact().getGroupId())) .flatMap(node -> node.getChildren().stream()) .filter(c -> BooleanUtils.isTrue(c.getOptional())) .collect(Collectors.toList());方式2:能获取可选依赖,但版本缺失
这段代码可以拿到可选依赖,但依赖的版本信息如果来自项目的dependencyManagement,就会丢失:List<Artifact> option2Artifacts = visitor.getNodes().stream() .filter(node -> groupIds.contains(node.getArtifact().getGroupId())) .flatMap(node -> optionalArtifacts(node).stream()) .collect(Collectors.toList());
问题根源与解决思路
经过排查,问题出在dependencyCollectorBuilder.collectDependencyGraph(request, null)方法上——它默认模拟项目构建时的依赖收集逻辑,会自动过滤可选依赖,同时无法正确解析来自dependencyManagement的版本信息。
解决方法是:为DependencyCollectorRequest提供自定义的DependencySelector,修改默认的依赖收集行为,让它保留所有可选依赖,并且能正确从dependencyManagement中读取版本。
内容的提问来源于stack exchange,提问作者T.Dabrowski
相关产品推荐
相关产品推荐

