java - Maven:在运行时访问 POM - 如何从任何地方获取 'pom.xml' 可用?

标签 java maven runtime pom.xml

我想从 pom.xml 访问一些信息以显示在信息对话框中。所以我用谷歌搜索并发现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 中的方法获取版本和artifactID。

最佳答案

问题在于

Model model = reader.read(new FileReader("pom.xml"));

尝试从程序执行的目录中读取 POM。通常,pom.xml不会被复制到target ,但它嵌入到生成的 Artifact 中。您可以覆盖并强制 Maven 将 POM 复制到 target目录(如果您愿意的话)(对于您自己的项目),但对于其他 Maven Artifact 它不会帮助您。

大多数时候,Maven Artifact 会将 POM 坐标包含在 JAR/WAR/EAR 输出中。如果您解压这样的文件,您会注意到有两个文件存储在 META-INF/maven/<groupId>/<artifactId> 下。 :pom.xmlpom.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><your artifactId>应该是相当静态的,但是如果您确实重新定位了 Artifact 的坐标,那么您也需要在代码中更改它。

关于java - Maven:在运行时访问 POM - 如何从任何地方获取 'pom.xml' 可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56482739/

相关文章:

android - 崩溃 - 运行时异常(MultiDex.java :178)

java - 有字符串 "naveen",希望输出为 "eennav"

java - 在 Java 中使用基于 Vector 的 Stack 实现而不是链表的动机是什么?

java - Maven Unicode 编码构建失败

java - “错误 : java: cannot access java. util.function.Function” - 尝试使用 WebDriverWait 时

java - 通过包含另一个属性文件来扩展属性文件。 maven

C 编程,指针运行时错误

java - 为什么运行时错误比编译时错误更难发现

java - 匹配相同的希伯来语单词总是返回 False

java - 继续获取文件列表直到退出