如何在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
相关产品推荐
相关产品推荐

