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

如何在Java中编程识别Gradle项目的依赖类型(如POM/JAR)

如何通过Java编程识别Gradle依赖的类型(POM/JAR/EJB等)

问题背景

gradle dependencies命令的默认输出不会像Maven那样显示依赖的类型(如jar/ejb/war/pom),但可以通过Gradle的Artifact Resolution API以编程方式,根据给定的Group-Artifact-Version(GAV)获取依赖类型信息。

核心解决方案:使用Gradle ArtifactResolutionQuery

不要直接实例化DefaultArtifactResolutionQuery(它是Gradle内部实现类,参数复杂且不推荐直接使用),而是通过Gradle提供的标准API构建查询:

1. 基础实现代码

在Gradle插件或通过Gradle Tooling API连接项目时,可以用以下代码获取指定GAV的依赖类型:

import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.query.ArtifactResolutionQuery;
import org.gradle.api.artifacts.result.ArtifactResolutionResult;
import org.gradle.api.artifacts.result.ResolvedArtifactResult;
import org.gradle.api.artifacts.result.ResolvedComponentResult;
import org.gradle.api.artifacts.type.JvmLibrary;

// 假设已获取Gradle Project实例(插件中可直接获取,或通过GradleConnector创建)
Project project = ...;

// 目标GAV
String group = "org.lunarray.model";
String name = "bom";
String version = "1.0";

// 构建查询
ArtifactResolutionQuery query = project.getDependencies().createArtifactResolutionQuery()
        .forComponents(Dependency.create(group, name, version))
        // 指定要查询的构件类型,JvmLibrary.JAR对应jar类型,可替换为其他类型
        .withArtifacts(JvmLibrary.class, JvmLibrary.JAR);

// 执行查询并处理结果
ArtifactResolutionResult result = query.execute();
for (ResolvedComponentResult component : result.getResolvedComponents()) {
    for (ResolvedArtifactResult artifact : component.getArtifacts()) {
        String artifactType = artifact.getType();
        System.out.printf("GAV: %s:%s:%s, 类型: %s%n", group, name, version, artifactType);
    }
}

2. 查询不同类型的构件

  • 查询POM类型:替换withArtifacts的参数为Maven组件类型
    import org.gradle.api.artifacts.type.MavenModule;
    // ...
    .withArtifacts(MavenModule.class, MavenModule.POM)
    
  • 查询所有类型构件:使用通用组件类型获取该GAV下的全部构件
    import org.gradle.api.artifacts.type.GenericComponent;
    // ...
    .withArtifacts(GenericComponent.class, GenericComponent.ARTIFACT)
    

3. 独立Java程序中获取Project实例

如果不在Gradle插件环境中,可通过Gradle Tooling API连接项目获取Project实例:

import org.gradle.tooling.GradleConnector;
import org.gradle.tooling.ProjectConnection;

GradleConnector connector = GradleConnector.newConnector();
connector.forProjectDirectory(new File("/path/to/your/project"));
try (ProjectConnection connection = connector.connect()) {
    Project project = connection.getModel(Project.class);
    // 执行上述查询逻辑
}

替代方案:使用Maven Aether API

如果环境允许依赖Maven生态,可直接用Aether库解析GAV的类型,无需依赖Gradle:

import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResult;

// 初始化Maven仓库系统
RepositorySystem system = MavenRepositorySystemUtils.newRepositorySystem();
RepositorySystemSession session = MavenRepositorySystemUtils.newSession();

// 添加远程仓库(如Maven Central)
RemoteRepository central = new RemoteRepository.Builder("central", "default", "https://repo1.maven.org/maven2/").build();

// 目标GAV
DefaultArtifact artifact = new DefaultArtifact("org.lunarray.model:bom:1.0");

// 构建并执行解析请求
ArtifactRequest request = new ArtifactRequest().setArtifact(artifact).addRepository(central);
ArtifactResult result = system.resolveArtifact(session, request);

// 获取构件类型
String artifactType = result.getArtifact().getExtension();
System.out.printf("GAV: %s, 类型: %s%n", artifact, artifactType);

内容的提问来源于stack exchange,提问作者Somak Dutta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:00:26