Maven: доступ к POM во время выполнения - как получить доступ к pom.xml из любого места? - PullRequest
1 голос
/ 06 июня 2019

Я хочу получить доступ к некоторой информации из pom.xml для отображения в диалоговом окне Информация. Так я погуглил и нашел этот пост :

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, поскольку это не ресурс. Есть ли способ обойти это?

Тем временем я использую подход из этого потока , чтобы получить версию и идентификатор артефакта.

1 Ответ

0 голосов
/ 07 июня 2019

Проблема в том, что

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

пытается прочитать POM из каталога, в котором выполняется ваша программа.Обычно pom.xml не копируется в target, но оно встроено в полученный артефакт.Вы можете переопределить и заставить Maven скопировать POM в каталог target, если хотите (для вашего собственного проекта), но это не поможет вам для других артефактов Maven.

Большую часть времени,артефакт Maven будет иметь координаты 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> должны быть довольно статичными, но если вы переместили координаты вашего артефакта, то вам также необходимо изменить это в своем коде.

...