如何在 java class 中获取 Maven 项目的依赖项列表

How to get list of dependencies of Maven project in java class

当我们将遗留项目迁移到 Maven 时,我们面临以下问题。

我们有一个核心项目 say,xyz 和子项目 p1、p2。要将子项目添加到核心项目中,我们只需将子项目的 jar 放入核心项目中即可。现在,当这个核心项目启动时,它会尝试通过检查核心项目目录 WEB-INF/lib 中所有 jar 的 MANIFEST 文件来查找是否有任何子项目。

现在在 Maven 项目结构中,没有 lib 目录,那么我如何才能获得核心项目使用的所有 jar 的列表(及其路径)?

感谢任何帮助。

看看每个项目的pom.xml

这就是 Maven 的优点(其中之一),每个依赖项都列在那里,因此您无需在不同的目录项目中寻找。

现在,如果您需要找到实际下载的文件,您应该检查您的 maven home 文件夹(MAVEN_HOME 或 M2_HOME)。

Maven dependencies plugin 显示你项目的所有依赖,甚至是传递的。请尝试:

$ mvn dependency:tree

如果您需要在运行时找出依赖关系,应该可以检查类路径(当您的项目由 Maven exec 启动时,Maven 会为您设置)。对于没有自定义类加载器的 Java SE 应用程序,以下应该有效:

    ClassLoader cl = ClassLoader.getSystemClassLoader();

    URL[] urls = ((URLClassLoader) cl).getURLs();
    for (URL url : urls) {
        System.out.println(url.getFile());
    }

您可以使用 jHades 查找重叠的 jar:

<dependency>
    <groupId>org.jhades</groupId>
    <artifactId>jhades</artifactId>
    <version>1.0.4</version>
</dependency>

new JHades()
.printClassLoaders()
.printClasspath()
.overlappingJarsReport()
.multipleClassVersionsReport()
.findClassByName("org.apache.bval.jsr303.ApacheValidationProvider")
.findClassByName("javax.validation.spi.ValidationProvider");