В Stack Overflow есть много сообщений об этом: stackoverflow.com/search?q=read+pom+in+java , по крайней мере, посмотрите перед публикацией. Так что помощники редактирования должны их показать. Гугл тоже.
Jean-Rémy Revy
Спасибо ребята. Теперь я понимаю, что это действительно плохая практика. Попробую другой подход.
Используйте плагин properties-maven-plugin, чтобы записать определенный pom propertiesв файл во время компиляции, а затем прочитать этот файл во время выполнения.
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.
Это будет работать только в том случае, если вы запускаете полученную сборку из Maven, возможно, используя maven-exec-plugin. Если вы просто используете Maven для компиляции кода, это не сработает.
Дэвид Пэшли,
@DavidPashley, это правда. В случае только компиляции, я предполагаю, что переменная должна быть установлена из плагина компилятора.
Сантош
7
Это можно сделать с помощью стандартных свойств Java в сочетании с maven-resource-plugin с включенной фильтрацией свойств.
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
Одинарные ответы здесь не приветствуются (в основном потому, что они могут стать бесполезными, когда связанный ресурс исчезнет). Вы должны, по крайней мере, обобщить информацию из ссылки на публикацию здесь.
Joachim Sauer
2
Это действительно очень плохая практика, просто используйте плагин ресурсов maven!
Марк Баккер
1
Почему это должно быть плохой практикой, если он хочет получить доступ к свойствам из кода Java?
SWoeste
1
Но только если вы предполагаете, что он хочет / может поменять помпон (ы). Я согласен с вами, что было бы плохо иметь свойства непосредственно в файле pom, а не во внешнем файле. Этот файл можно прочитать с помощью класса свойств java - конечно. Но что в другом случае? Тогда maven-model - лучшее решение для решения этой проблемы ... но прежде чем Дэвид Дай не скажет нам, что именно он хочет сделать, мы все только догадываемся.
SWoeste
1
Насколько я понимаю, у нас есть один файл pom mvn (содержащий свойства) и одно приложение java (откуда мы хотим читать детали этого файла pom). На самом деле без запуска maven.
Андреас Долк
-4
Вы можете проанализировать файл pom с помощью JDOM (http://www.jdom.org/).
Ответы:
Используйте плагин 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");
источник
compile
. Не уверен, что это правильное решение.Настроить системную переменную из Maven и в java используйте следующий вызов
System.getProperty("Key");
источник
Это можно сделать с помощью стандартных свойств Java в сочетании с
maven-resource-plugin
с включенной фильтрацией свойств.Для получения дополнительной информации см. Http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html.
Это будет работать для стандартного проекта maven, как и для проектов плагинов
источник
У 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
источник
Вы можете проанализировать файл pom с помощью JDOM (http://www.jdom.org/).
источник