【问题标题】:Java - How to list the dependenciesJava - 如何列出依赖项
【发布时间】:2018-06-18 10:28:45
【问题描述】:

我希望我的 Java 程序先记录依赖关系。我知道mvn dependency:tree 命令,但是创建的Jar 文件不会在装有Maven 的计算机上执行。

程序执行过程中如何获取依赖列表?

【问题讨论】:

  • 打印类路径?
  • 这会打印 pom.xml 文件中存在的依赖项吗?没有命令行我怎么能做到这一点?
  • 是的,在 pom.xml 中指定的依赖项会在创建构建工件时添加到类路径中(当然要考虑依赖项的范围)。您可以从 java 代码中打印类路径。
  • 这可能对您有帮助吗? :stackoverflow.com/questions/38635488/… 然后你只需解析清单文件,你就会看到创建项目时使用的东西..
  • 或者您可以导航到 META-INF 文件夹中的 maven 文件夹,并在那里找到您的包结构和 pom.xml 文件。从那里,只需解析 pom.xml 文件的依赖项。

标签: java spring maven


【解决方案1】:

您可以编写自己的parser,这样您就可以定义您的自定义格式。

一个非常基本的(仅使用 jdk 内置库)可能如下所示:

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
// other imports...

public static void printPomDependencies() throws IOException, SAXException, ParserConfigurationException {
    // pom relative to your project directory
    final File pomFile = new File("./pom.xml");

    DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = dBuilder.parse(pomFile);
    doc.getDocumentElement().normalize();
    final NodeList dependencyNodes = doc.getElementsByTagName("dependency");

    for (int i = 0; i < dependencyNodes.getLength(); i++) {
        final Node n = dependencyNodes.item(i);

        final NodeList list = n.getChildNodes();

        System.out.println("----------------------------------");
        for (int j = 0; j < list.getLength(); j++) {
            final Node n2 = list.item(j);
            // do not print empty text nodes or others...
            if (n2.getNodeType() != Node.ELEMENT_NODE) continue;


            System.out.println(n2.getNodeName() + ":" + n2.getTextContent());

        }
    }
} 

例如,此解析器打印以下输出:

----------------------------------
groupId:io.spring.platform
artifactId:platform-bom
version:Brussels-SR6
type:pom
scope:import
----------------------------------
groupId:org.springframework.boot
artifactId:spring-boot-starter-web
----------------------------------
groupId:org.springframework
artifactId:spring-context
version:5.0.2.RELEASE
----------------------------------
groupId:org.springframework.data
artifactId:spring-data-jpa
version:2.0.2.RELEASE

【讨论】:

  • 这里没有列出传递依赖。
  • 我不需要传递依赖,我只想列出实际的依赖。但是知道了 GroupId 和 ArtifactID,我们就不能读取每个依赖项的 pom.xml 文件吗?
  • 一旦构建了jar,这是否也可以工作,是否会找到./pom.xml?
  • @MattewEon 我正在尝试,但它太混乱了。如果您想尝试记住 Maven 依赖项存储在默认位置(除非您另外指定)E.g: Windows -&gt; C://Users/&lt;User&gt;/.m2/repository。依赖项遵循以下模式:groupId/artifactId/version/artifactId-version.pom 例如:答案中列出的第一个 dep 将位于(来自 ./m2 路径)io/spring/platform/platform-bom/Brussels-SR6/platform-bom-Brussels-sR6.pom
  • @MattewEon 2) 没有尝试过。
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
相关资源
最近更新 更多