我想从 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.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>
和<your artifactId>
应该是相当静态的,但是如果您确实重新定位了 Artifact 的坐标,那么您也需要在代码中更改它。
关于java - Maven:在运行时访问 POM - 如何从任何地方获取 'pom.xml' 可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56482739/