我想从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。
答案 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>
应该是相当静态的,但是如果要重定位工件的坐标,那么还需要在代码中进行更改。