Acceda a las propiedades de maven definidas en el pom

81

¿Cómo accedo a las propiedades de maven definidas en el pom en un proyecto de maven normal y en un proyecto de complemento de maven?

SparedWhisle
fuente
1
¿En qué tipo de información estás interesado? Si solo se trata de versiones o cosas similares, entonces probablemente sea una mejor idea ponerlo en el manifiesto y leerlo desde allí .
Joachim Sauer
1
Hay muchas publicaciones en Stack Overflow sobre esto: stackoverflow.com/search?q=read+pom+in+java , al menos, eche un vistazo antes de la publicación. ASÍ que los ayudantes de edición deberían mostrarlos. Google también.
Jean-Rémy Revy
Gracias chicos. Ahora me doy cuenta de que esta es una mala práctica. Voy a intentar otro enfoque.
SparedWhisle

Respuestas:

76

Use el plugin properties-maven para escribir un pom específico propertiesen un archivo en tiempo de compilación y luego lea ese archivo en tiempo de ejecución.

En su 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>

Y luego en .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
fuente
Eso funcionó, pero hizo que Eclipse cayera en un bucle infinito de compilación / implementación a Tomcat (compilación -> generar mis.propiedades -> recurso cambiado -> compilación), así que tuve que cambiar de fase a compile. Sin embargo, no estoy seguro de si es la solución adecuada.
Nikita Bosik
@atoregozh sugirió usar Guava Resource en su lugar para cargar el archivo de propiedades. OKAY. Pero se revertió el cambio para mantener este ejemplo al mínimo con las API estándar.
Leif Gruenwoldt
2
Una versión estable 1.0.0 ya está disponible
Pieter De Bie
25

Configure una variable de sistema de Maven y en java use la siguiente llamada

System.getProperty("Key");
Santosh
fuente
7
Esto solo funcionará si está ejecutando la compilación resultante de Maven, tal vez usando el complemento maven-exec-plugin. Si solo está utilizando Maven para compilar el código, esto no funcionará.
David Pashley
@DavidPashley, eso es cierto. En el caso de solo compilación, supongo que la variable debe configurarse desde el complemento del compilador.
Santosh
6

Maven ya tiene una solución para hacer lo que quieras:

Obtenga MavenProject solo desde el analizador POM.xml - pom?

por cierto: primer golpe en la búsqueda de 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
fuente
1
Aquí se desaconsejan las respuestas de enlace único (principalmente porque pueden volverse inútiles cuando el recurso vinculado desaparece). Debería al menos resumir la información del enlace para publicar aquí.
Joachim Sauer
2
Esta es realmente una muy mala práctica, ¡solo use el complemento de recursos de maven!
Mark Bakker
1
¿Por qué debería ser una mala práctica si quiere acceder a las propiedades desde el código java?
SWoeste
1
Pero solo si asume que él quiere / podría cambiar su (s) pom (s). Estoy de acuerdo contigo en que podría ser malo tener las propiedades directamente en el archivo pom en lugar de en un archivo externo. Ese archivo podría leerse con la clase de propiedades de Java, seguro. Pero, ¿y en el otro caso? Entonces el modelo maven es la mejor solución para hacer el truco ... pero antes de que David Dai no nos diga qué es exactamente lo que quiere hacer, todos solo estamos adivinando.
SWoeste
1
También entendí que tenemos un archivo pom mvn (que contiene propiedades) y una aplicación java (desde donde queremos leer los detalles de ese archivo pom). Sin realmente ejecutar maven.
Andreas Dolk
-4

Puede analizar el archivo pom con JDOM (http://www.jdom.org/).

alien01
fuente