如何在Maven中获取依赖树而不下载被隔离的JAR包
获取隔离JAR场景下的Maven依赖树方法
Maven命令方式
因为被隔离的只是JAR包,POM仍可正常访问,所以可以通过让Maven仅解析POM来生成依赖树,跳过JAR下载步骤:
- 执行以下命令:
这两个参数会阻止Maven尝试下载JAR和源码文件,仅通过POM解析完整的依赖树,避免405错误中断流程。mvn dependency:tree -Dmaven.dependency.get.jars=false -Dmaven.dependency.get.sources=false - 若需要指定特定配置文件,可追加
-s /path/to/settings.xml参数,确保Maven能正确访问内部Artifactory仓库(如有认证需求)。
Java代码方式
使用Apache Maven Resolver库手动解析POM并构建依赖树,该库支持单独处理POM解析,无需下载JAR:
先添加必要依赖到你的项目POM:
<dependency> <groupId>org.apache.maven.resolver</groupId> <artifactId>maven-resolver-api</artifactId> <version>1.9.15</version> </dependency> <dependency> <groupId>org.apache.maven.resolver</groupId> <artifactId>maven-resolver-impl</artifactId> <version>1.9.15</version> </dependency> <dependency> <groupId>org.apache.maven.resolver</groupId> <artifactId>maven-resolver-connector-basic</artifactId> <version>1.9.15</version> </dependency> <dependency> <groupId>org.apache.maven.resolver</groupId> <artifactId>maven-resolver-transport-http</artifactId> <version>1.9.15</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model-builder</artifactId> <version>3.9.5</version> </dependency>编写解析代码:
import org.apache.maven.model.Model; import org.apache.maven.model.building.DefaultModelBuilder; import org.apache.maven.model.building.DefaultModelBuilderFactory; import org.apache.maven.model.building.DefaultModelBuildingRequest; import org.apache.maven.model.building.ModelBuildingRequest; import org.apache.maven.resolver.examples.util.Booter; import org.apache.maven.resolver.internal.impl.DefaultRepositorySystem; import org.apache.maven.resolver.repository.RepositorySystem; import org.apache.maven.resolver.repository.RepositorySystemSession; import org.apache.maven.resolver.repository.remote.RemoteRepository; import java.io.File; import java.util.List; public class DependencyTreeParser { public static void main(String[] args) throws Exception { // 初始化仓库系统 RepositorySystem repoSystem = Booter.newRepositorySystem(); RepositorySystemSession session = Booter.newRepositorySystemSession(repoSystem); // 配置内部Artifactory仓库(替换为实际地址) RemoteRepository internalRepo = new RemoteRepository.Builder("internal-artifactory", "default", "http://your-artifactory-url/repository/maven-public/") .build(); session.setRemoteRepositories(List.of(internalRepo)); // 加载目标项目POM File pomFile = new File("/path/to/your/project/pom.xml"); DefaultModelBuilder modelBuilder = new DefaultModelBuilderFactory().newInstance(); ModelBuildingRequest request = new DefaultModelBuildingRequest() .setPomFile(pomFile) .setRepositorySession(session) .setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL); // 构建模型并打印依赖树 Model model = modelBuilder.build(request).getEffectiveModel(); System.out.println("项目依赖树:"); printDependencyTree(model.getDependencies(), 0); } private static void printDependencyTree(List<org.apache.maven.model.Dependency> dependencies, int depth) { String indent = " ".repeat(depth); for (org.apache.maven.model.Dependency dep : dependencies) { System.out.printf("%s%s:%s:%s%n", indent, dep.getGroupId(), dep.getArtifactId(), dep.getVersion()); // 如需递归解析传递依赖,可扩展此处逻辑:通过仓库系统获取依赖的POM并继续解析 } } }注意:替换代码中的仓库地址和POM路径,若仓库需要认证,需在仓库配置中添加用户名和密码。
内容的提问来源于stack exchange,提问作者himanshu_mps
相关产品推荐
相关产品推荐

