Доступ к свойствам 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.