如何通过Maven API获取项目依赖对应的远程仓库URL
Maven依赖来源仓库获取方案(官方API实现)
核心API说明
你可以通过Maven官方的RepositorySystem和ArtifactResolver接口直接获取依赖的实际来源仓库(包含镜像URL),这是Maven内部依赖解析的标准路径,完全规避你提到的三种非理想方案。
具体实现步骤
在插件Mojo中注入必要组件
在你的插件Mojo类中,注入RepositorySystem、MavenSession和ProjectBuildingRequest,这些是依赖解析的核心上下文:@Component private RepositorySystem repositorySystem; @Parameter(defaultValue = "${session}", readonly = true) private MavenSession session; @Parameter(defaultValue = "${projectBuildingRequest}", readonly = true) private ProjectBuildingRequest buildingRequest;解析单个依赖的来源仓库
针对任意依赖(从MavenProject的getArtifacts()或getDependencies()获取),构建Artifact对象并调用resolveArtifact方法,返回的ArtifactResult会包含实际下载该依赖的RemoteRepository实例:// 以某个具体依赖为例 Artifact artifact = repositorySystem.createArtifactWithClassifier("com.example", "demo-lib", "1.0.0", "jar", null); ArtifactResult resolveResult = repositorySystem.resolveArtifact(buildingRequest, artifact); RemoteRepository sourceRepo = resolveResult.getRepository(); String actualRepoUrl = sourceRepo.getUrl(); // 这里拿到的就是实际使用的仓库URL(含镜像)遍历项目所有依赖
通过MavenProject获取完整依赖列表,逐个执行上述解析逻辑即可收集所有依赖的来源仓库信息:@Parameter(defaultValue = "${project}", readonly = true) private MavenProject project; // 遍历项目已解析的构件 for (Artifact artifact : project.getArtifacts()) { ArtifactResult result = repositorySystem.resolveArtifact(buildingRequest, artifact); RemoteRepository repo = result.getRepository(); // 记录groupId:artifactId:version -> repo.getUrl() }
所需依赖配置
在插件的pom.xml中引入必要的Maven API依赖(scope设为provided,因为Maven运行时会提供):
<dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-core</artifactId> <version>3.8.6</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven.resolver</groupId> <artifactId>maven-resolver-api</artifactId> <version>1.8.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven.resolver</groupId> <artifactId>maven-resolver-impl</artifactId> <version>1.8.3</version> <scope>provided</scope> </dependency> </dependencies>
补充说明
- 如果需要处理完整的传递依赖树,可以结合
DependencyCollector接口来构建完整依赖树后再解析每个节点的来源仓库。 - 该方法返回的仓库URL是Maven实际用于下载依赖的地址(如果配置了镜像,会直接返回镜像URL),完全满足你生成验证报告的需求。
内容的提问来源于stack exchange,提问作者Pawel Veselov
相关产品推荐
相关产品推荐

