Доступ до властивостей maven, визначених у pom


81

Як отримати доступ до властивостей maven, визначених у pom у звичайному проекті maven та у проекті плагіна maven?


1
Яка інформація вас цікавить? Якщо це лише версії або подібні речі, то, мабуть, краще додати це в маніфест і прочитати звідти .
Йоахім Зауер,

1
Про це є багато публікацій у Stack Overflow: stackoverflow.com/search?q=read+pom+in+java , принаймні, погляньте перед публікацією. ТАК помічники редагування повинні їх показати. Google теж.
Jean-Rémy Revy

Спасибі, хлопці. Зараз я усвідомлюю, що це насправді погана практика. Попробую інший підхід.
Позбавлений Whisle

Відповіді:


76

Використовуйте властивість-maven-plugin, щоб записати певний pom propertiesу файл під час компіляції, а потім прочитати цей файл під час виконання.

У вашому pom.xml :

<properties>
     <name>${project.name}</name>
     <version>${project.version}</version>
     <foo>bar</foo>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.outputDirectory}/my.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

А потім у .java :

java.io.InputStream is = this.getClass().getResourceAsStream("my.properties");
java.util.Properties p = new Properties();
p.load(is);
String name = p.getProperty("name");
String version = p.getProperty("version");
String foo = p.getProperty("foo");

Це спрацювало, але змусило Eclipse потрапити в нескінченний цикл build / deploy-to-Tomcat (build -> generiraj my.properties -> ресурс змінено -> build), тому мені довелося змінити фазу на compile. Не впевнений, що це правильне рішення.
Микита Босік

@atoregozh запропонував використовувати Guava Resource's замість цього для завантаження файлу властивостей. ГАРАЗД. Але скасовано зміни, щоб зберегти цей приклад мінімальним зі стандартними API.
Leif Gruenwoldt

2
Зараз доступна стабільна версія 1.0.0
Пітер Де Бі

25

Налаштуйте системну змінну від Maven і в Java використовуйте наступний виклик

System.getProperty("Key");

7
Це буде працювати лише в тому випадку, якщо ви запускаєте отриману збірку від Maven, можливо, використовуючи плагін maven-exec-plugin. Якщо ви просто використовуєте Maven для компіляції коду, це не спрацює.
David Pashley,

@DavidPashley, це правда. У випадку лише компіляції, я думаю, змінну потрібно встановити з плагіна компілятора.
Сантош

7

Це можна зробити за допомогою стандартних властивостей Java у поєднанні з maven-resource-plugin з увімкненою фільтрацією властивостей.

Для отримання додаткової інформації див. Http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

Це буде працювати для стандартного проекту maven, як і для проектів плагінів


6

Maven вже має рішення зробити те, що ви хочете:

Отримати MavenProject лише з POM.xml - синтаксичного аналізатора POM?

до речі: перший удар при пошуку в Google;)

Model model = null;
FileReader reader = null;
MavenXpp3Reader mavenreader = new MavenXpp3Reader();

try {
     reader = new FileReader(pomfile); // <-- pomfile is your pom.xml
     model = mavenreader.read(reader);
     model.setPomFile(pomfile);
}catch(Exception ex){
     // do something better here
     ex.printStackTrace()
}

MavenProject project = new MavenProject(model);
project.getProperties() // <-- thats what you need

1
Тут не рекомендується відповідати за одними посиланнями (здебільшого тому, що вони можуть стати марними, коли зв’язаний ресурс зникне). Вам слід принаймні узагальнити інформацію з посилання на публікацію тут.
Йоахім Зауер,

2
Це насправді дуже погана практика, просто використовуйте плагін ресурсу maven!
Mark Bakker

1
Чому це має бути поганою практикою, якщо він хоче отримати доступ до властивостей з коду Java?
SWeste,

1
Але лише якщо ви припускаєте, що він хоче / міг змінити свої помпони. Я погоджуюсь з вами, що може бути погано мати властивості безпосередньо у файлі pom, а не у зовнішньому файлі. Цей файл можна прочитати за допомогою класу властивостей Java - звичайно. Але що в іншому випадку? Тоді модель maven - найкраще рішення для трюку ... але перед тим, як Девід Дай не скаже нам, що саме він хоче зробити, ми всі лише здогадуємось.
SWoeste

1
Я також зрозумів, що у нас є один файл mvn pom (що містить властивості) та одна програма Java (звідки ми хочемо прочитати деталі цього файлу pom). Без фактичного запуску Maven.
Andreas Dolk,

-4

Ви можете проаналізувати файл pom за допомогою JDOM (http://www.jdom.org/).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.