Maven:在运行时访问POM-如何从任何地方获取“ pom.xml”?

时间:2019-06-06 17:51:19

标签: java maven runtime pom.xml

我想从pom.xml访问一些信息以显示在“信息”对话框中。因此,我用Google搜索并找到了this post

public class MavenModelExample {
    public static void main(String[] args) throws IOException, XmlPullParserException {
        MavenXpp3Reader reader = new MavenXpp3Reader();
        Model model = reader.read(new FileReader("pom.xml"));
        System.out.println(model.getId());
        System.out.println(model.getGroupId());
        System.out.println(model.getArtifactId());
        System.out.println(model.getVersion());
    }
}

我在工具中实现了它,

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-model</artifactId>
  <version>3.3.9</version>
</dependency>

对我的pom感到高兴,当我使用java -jar target\mytool.jar从项目根目录运行该工具时,一切都按预期运行。

当我移至其他任何目录时,例如直接进入target并使用java -jar mytool.jar执行我的工具,我得到:

java.io.FileNotFoundException: pom.xml (The system cannot find the specified file)
        at java.base/java.io.FileInputStream.open0(Native Method)
        at java.base/java.io.FileInputStream.open(FileInputStream.java:213)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:110)
        at java.base/java.io.FileReader.<init>(FileReader.java:60)

这是一种易于理解的东西。代码应该如何知道pom.xml的位置,因为它不是资源。有什么办法可以解决这个问题?

同时,我使用this thread中的方法来获取版本和工件ID。

1 个答案:

答案 0 :(得分:0)

问题是

[
  {
    "Country Abbreviation": "Other",
    "Country Abbreviation with mapping": [
      "NO",
      "Other",
      "SE"
    ],
    "_deleted": false,
    "_hash": "f2ed1ca17e97917245d6b465ca7ed7ae",
    "_id": "1",
    "_previous": 71,
    "_ts": 1559888447704105,
    "_updated": 72,
    "convert-to-int": "~f1.5",
    "country": [
      "Norway",
      "Denmark",
      "Sweden"
    ]
  }
]

尝试从执行程序的目录中读取POM。通常,Model model = reader.read(new FileReader("pom.xml")); 不会复制到pom.xml,但会嵌入到生成的工件中。如果需要(对于您自己的项目),可以覆盖并强制Maven将POM复制到target目录,但是对于其他Maven工件,它无济于事。

大多数时候,Maven工件将在JAR / WAR / EAR输出中包含POM坐标。如果解压缩此类文件,您会注意到target下存储了两个文件:META-INF/maven/<groupId>/<artifactId>pom.xml,其中后者比pom.properties更容易解析,但是它不包括依赖项。

从类路径(而不是从磁盘)解析嵌入式pom.xml对您来说应该更好,特别是如果您始终使用pom.xml运行程序。在您的程序中,尝试以下操作:

java -jar target\mytool.jar

try (InputStream is = MavenModelExample.class.getClassLoader().getResourceAsStream("META-INF/maven/<your groupId>/<your artifactId>/pom.xml")) { MavenXpp3Reader reader = new MavenXpp3Reader(); Model model = reader.read(is); System.out.println(model.getId()); System.out.println(model.getGroupId()); System.out.println(model.getArtifactId()); System.out.println(model.getVersion()); // If you want to get fancy: model.getDependencies().stream().forEach(System.out::println); } catch (IOException e) { // Do whatever you need to do if the operation fails. } <your groupId>应该是相当静态的,但是如果要重定位工件的坐标,那么还需要在代码中进行更改。