Доступ к свойствам maven, определенным в pom


81

Как мне получить доступ к свойствам maven, определенным в pom, в обычном проекте maven и в проекте плагина maven?


1
Какая информация вас интересует? Если это просто версии или похожие вещи, то, вероятно, лучше поместить их в манифест и прочитать оттуда .
Joachim Sauer

1
В Stack Overflow есть много сообщений об этом: stackoverflow.com/search?q=read+pom+in+java , по крайней мере, посмотрите перед публикацией. Так что помощники редактирования должны их показать. Гугл тоже.
Jean-Rémy Revy

Спасибо ребята. Теперь я понимаю, что это действительно плохая практика. Попробую другой подход.
SparedWhisle

Ответы:


76

Используйте плагин properties-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 попасть в бесконечный цикл сборки / развертывания в Tomcat (сборка -> сгенерировать my.properties -> ресурс изменен -> сборка), поэтому мне пришлось изменить фазу на compile. Не уверен, что это правильное решение.
Никита Босик

@atoregozh предложил использовать Guava Resource вместо загрузки файла свойств. ХОРОШО. Но отменил изменение, чтобы этот пример был минимальным со стандартными API.
Лейф Грюнвольдт

2
Стабильная версия 1.0.0 уже доступна
Питер Де Би

25

Настроить системную переменную из Maven и в java используйте следующий вызов

System.getProperty("Key");

7
Это будет работать только в том случае, если вы запускаете полученную сборку из Maven, возможно, используя maven-exec-plugin. Если вы просто используете Maven для компиляции кода, это не сработает.
Дэвид Пэшли,

@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
Одинарные ответы здесь не приветствуются (в основном потому, что они могут стать бесполезными, когда связанный ресурс исчезнет). Вы должны, по крайней мере, обобщить информацию из ссылки на публикацию здесь.
Joachim Sauer

2
Это действительно очень плохая практика, просто используйте плагин ресурсов maven!
Марк Баккер

1
Почему это должно быть плохой практикой, если он хочет получить доступ к свойствам из кода Java?
SWoeste

1
Но только если вы предполагаете, что он хочет / может поменять помпон (ы). Я согласен с вами, что было бы плохо иметь свойства непосредственно в файле pom, а не во внешнем файле. Этот файл можно прочитать с помощью класса свойств java - конечно. Но что в другом случае? Тогда maven-model - лучшее решение для решения этой проблемы ... но прежде чем Дэвид Дай не скажет нам, что именно он хочет сделать, мы все только догадываемся.
SWoeste

1
Насколько я понимаю, у нас есть один файл pom mvn (содержащий свойства) и одно приложение java (откуда мы хотим читать детали этого файла pom). На самом деле без запуска maven.
Андреас Долк

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.