Uzyskaj dostęp do właściwości maven zdefiniowanych w pliku pom

81

Jak uzyskać dostęp do właściwości Maven zdefiniowanych w pom w normalnym projekcie Maven oraz w projekcie wtyczki Maven?

SparedWhisle
źródło
1
Jakie informacje Cię interesują? Jeśli są to tylko wersje lub podobne rzeczy, prawdopodobnie lepszym pomysłem jest umieszczenie ich w manifeście i przeczytanie stamtąd .
Joachim Sauer,
1
W Stack Overflow jest dużo postów na ten temat: stackoverflow.com/search?q=read+pom+in+java , przynajmniej zajrzyj przed postem. Pomocnicy edycji SO powinni je pokazać. Google też.
Jean-Rémy Revy,
Dzięki chłopaki. Teraz zdaję sobie sprawę, że to naprawdę zła praktyka. Spróbuję innego podejścia.
SparedWhisle

Odpowiedzi:

76

Użyj wtyczki properties-maven, aby zapisać konkretny propertiesplik pom do pliku w czasie kompilacji, a następnie odczytaj ten plik w czasie wykonywania.

W twoim 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>

A następnie w .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");
Leif Gruenwoldt
źródło
To zadziałało, ale sprawiło, że Eclipse wpadł w nieskończoną pętlę kompilacji / wdrażania na Tomcat (buduj -> generuj moje.properties -> zmieniono zasób -> buduj), więc musiałem zmienićcompile . Nie jestem jednak pewien, czy to właściwe rozwiązanie.
Nikita Bosik
@atoregozh zasugerował użycie zamiast tego zasobów Guava do załadowania pliku właściwości. DOBRZE. Ale cofnięto zmianę, aby ten przykład był minimalny dzięki standardowym interfejsom API.
Leif Gruenwoldt
2
Stabilna wersja 1.0.0 jest już dostępna
Pieter De Bie
25

Skonfiguruj zmienną systemową z Mavena iw java użyj następującego wywołania

System.getProperty("Key");
Santosh
źródło
7
To zadziała tylko wtedy, gdy uruchomisz wynikową kompilację z Mavena, być może używając wtyczki maven-exec-plugin. Jeśli używasz Mavena do kompilowania kodu, to nie zadziała.
David Pashley,
@DavidPashley, to prawda. W przypadku kompilacji, myślę, że zmienna musi być ustawiona z wtyczki kompilatora.
Santosh
6

Maven ma już rozwiązanie, dzięki któremu możesz robić to, co chcesz:

Pobierz MavenProject z samego POM.xml - pom parser?

btw: pierwsze trafienie w wyszukiwarce 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
SWoeste
źródło
1
Odradza się tutaj odpowiedzi z jednym linkiem (głównie dlatego, że mogą stać się bezużyteczne, gdy zasób, do którego prowadzi łącze, zniknie). Powinieneś przynajmniej podsumować informacje z linku do postu tutaj.
Joachim Sauer,
2
To naprawdę bardzo zła praktyka, po prostu użyj wtyczki zasobów maven!
Mark Bakker,
1
Dlaczego miałoby to być złą praktyką, jeśli chce uzyskać dostęp do właściwości z kodu Java?
SWoeste,
1
Ale tylko wtedy, gdy zakładasz, że chce / może zmienić swoje pom (y). Zgadzam się z Tobą, że posiadanie właściwości bezpośrednio w pliku pom zamiast w zewnętrznym pliku może być złe. Ten plik można odczytać z klasą właściwości java - jasne. Ale co w drugim przypadku? W takim razie model maven jest najlepszym rozwiązaniem, aby załatwić sprawę ... ale zanim David Dai nie powie nam, czego dokładnie chce, wszyscy tylko zgadujemy.
SWoeste,
1
Zrozumiałem również, że mamy jeden plik mvn pom (zawierający właściwości) i jedną aplikację java (skąd chcemy odczytać szczegóły tego pliku pom). Bez faktycznego biegacza.
Andreas Dolk,
-4

Możesz przeanalizować plik pom za pomocą JDOM (http://www.jdom.org/).

alien01
źródło