Greifen Sie auf die im POM definierten Maven-Eigenschaften zu

80

Wie greife ich in einem normalen Maven-Projekt und in einem Maven-Plugin-Projekt auf im POM definierte Maven-Eigenschaften zu?

SparedWhisle
quelle
1
Für welche Art von Informationen interessieren Sie sich? Wenn es sich nur um Versionen oder ähnliche Dinge handelt, ist es wahrscheinlich eine bessere Idee, sie in das Manifest aufzunehmen und von dort aus zu lesen .
Joachim Sauer
1
In Stack Overflow gibt es eine Menge Beiträge dazu: stackoverflow.com/search?q=read+pom+in+java. Schauen Sie sich zumindest vor dem Beitrag um. SO sollten Bearbeitungshelfer sie anzeigen. Google auch.
Jean-Rémy Revy
Danke Leute. Mir ist jetzt klar, dass dies eine wirklich schlechte Praxis ist. Ich werde einen anderen Ansatz versuchen.
SparedWhisle

Antworten:

76

Verwenden Sie das Eigenschaften-Maven-Plugin , um propertieszur Kompilierungszeit einen bestimmten POM in eine Datei zu schreiben und diese Datei dann zur Laufzeit zu lesen.

In Ihrer 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>

Und dann in .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
quelle
Das hat funktioniert, aber Eclipse ist in eine unendliche Build / Deploy-to-Tomcat-Schleife geraten (Build -> Generieren von my.properties -> Ressource geändert -> Build), sodass ich die Phase auf ändern musste compile. Ich bin mir nicht sicher, ob es die richtige Lösung ist.
Nikita Bosik
@atoregozh schlug vor, stattdessen Guava-Ressourcen zum Laden der Eigenschaftendatei zu verwenden. IN ORDNUNG. Die Änderung wurde jedoch rückgängig gemacht, um dieses Beispiel mit Standard-APIs auf ein Minimum zu beschränken.
Leif Gruenwoldt
2
Eine stabile Version 1.0.0 ist ab sofort verfügbar
Pieter De Bie
25

Richten Sie eine Systemvariable in Maven ein und verwenden Sie in Java den folgenden Aufruf

System.getProperty("Key");
Santosh
quelle
7
Dies funktioniert nur, wenn Sie den resultierenden Build von Maven ausführen, möglicherweise mit dem Maven-Exec-Plugin. Wenn Sie nur Maven zum Kompilieren des Codes verwenden, funktioniert dies nicht.
David Pashley
@ DavidPashley, das ist wahr. Im Fall nur der Kompilierung muss die Variable vermutlich über das Compiler-Plugin festgelegt werden.
Santosh
5

Maven hat bereits eine Lösung, um das zu tun, was Sie wollen:

MavenProject nur aus dem POM.xml - Pom Parser herunterladen?

Übrigens: erster Treffer bei der Google-Suche;)

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
quelle
1
Von Single-Link-Antworten wird hier abgeraten (hauptsächlich, weil sie unbrauchbar werden können, wenn die verknüpfte Ressource nicht mehr verfügbar ist). Sie sollten zumindest die Informationen aus dem verlinkten Beitrag hier zusammenfassen.
Joachim Sauer
2
Dies ist wirklich eine sehr schlechte Praxis, verwenden Sie einfach das Maven Resource Plugin!
Mark Bakker
1
Warum sollte dies eine schlechte Praxis sein, wenn er über Java-Code auf die Eigenschaften zugreifen möchte?
SWoeste
1
Aber nur wenn Sie davon ausgehen, dass er seine Pom (s) ändern möchte / könnte. Ich stimme Ihnen zu, dass es möglicherweise schlecht ist, die Eigenschaften direkt in der POM-Datei anstelle einer externen Datei zu haben. Diese Datei könnte mit der Java-Eigenschaftenklasse gelesen werden - sicher. Aber was im anderen Fall? Dann ist das Maven-Modell die beste Lösung, um den Trick zu machen ... aber bevor David Dai uns nicht sagt, was genau er tun will, raten wir alle nur.
SWoeste
1
Ich habe auch verstanden, dass wir eine MVN-POM-Datei (mit Eigenschaften) und eine Java-Anwendung (von wo aus wir Details dieser POM-Datei lesen möchten) haben. Ohne tatsächlich Maven laufen zu lassen.
Andreas Dolk
-4

Sie können die POM-Datei mit JDOM (http://www.jdom.org/) analysieren.

alien01
quelle