¿Cuál es la forma más sencilla de recuperar el número de versión de maven's pom.xml en el código, es decir, programáticamente?Recuperar la versión de maven pom.xml en el código
Respuesta
Suponiendo que está usando Java, puede
Crear un archivo en el directorio de
.properties
(más comúnmente)src/main/resources
(pero en el paso 4 se veía que buscar en otra parte).establecer el valor de una propiedad en el archivo de
.properties
utilizando la propiedad estándar Maven para la versión de proyecto:foo.bar=${project.version}
En su código Java, cargar el valor del archivo de propiedades como un recurso de la ruta de clase (Google para ejemplos copiosos de cómo hacer esto, pero here's an example for starters).
En Maven, habilite el filtrado de recursos: esto hará que Maven copie ese archivo en sus clases de salida y traduzca el recurso durante esa copia, interpretando la propiedad. Usted puede encontrar algo de información here pero que en su mayoría sólo hacer esto en su pom:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
También puede llegar a otras propiedades estándar como project.name
, project.description
, o propiedades incluso arbitrarias usted pone en su pom <properties>
, El filtrado de recursos, combinado con los perfiles de Maven, puede proporcionarle un comportamiento de compilación variable en el momento de la compilación. Cuando especifica un perfil en tiempo de ejecución con -PmyProfile
, eso puede habilitar propiedades que luego pueden aparecer en su compilación.
artefactos envasados contienen un archivo META-INF/maven/${groupId}/${artifactId}/pom.properties
cuyo contenido será similar a:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
Muchas aplicaciones utilizan este archivo para leer la versión de la aplicación/jar en tiempo de ejecución, no es cero configuración requerida.
El único problema con el enfoque anterior es que este archivo se genera (actualmente) durante la fase package
y por lo tanto no estará presente durante las pruebas, etc. (hay un problema Jira para cambiar esto, vea MJAR-76). Si esto es un problema para usted, entonces el enfoque descrito por Alex es el camino a seguir.
para las personas que buscan un ejemplo leyendo las propiedades, esta publicación contiene varios métodos: http://www.javablog.fr/javaspring-get-and-display-the-version-from-manifest-mf.html – chrismarx
También existe el método descrito en el Easy way to display your apps version number using Maven:
añadir esto a pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>test.App</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
A continuación, utilice la siguiente:
App.class.getPackage().getImplementationVersion()
he encontrado que este método es más simple.
-1 - Esta solución no funcionó para mí; el valor de 'getImplementationVersion()' era 'null'. (versión 3.0.4 de maven) –
dependiendo de la fase ...solo funciona cuando el artefacto está siendo empaquetado, por lo que no funciona en pruebas unitarias: -/ – wikier
Para artefactos '.war', recuerde usar' maven-war-plugin' en lugar de 'maven-jar-plugin' –
Utilice esta biblioteca para la facilidad de una solución simple. Agregue al manifiesto lo que necesite y luego consulte por cadena.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Si utiliza envases mvn como tarro o de la guerra, el uso:
getClass().getPackage().getImplementationVersion()
Se lee una propiedad "Implementación-Version" de la META-INF/MANIFIESTO generado. MF (que se establece en la versión de pom.xml) en el archivo.
En resorte de arranque proyectos puede hacerlo de esta manera:
PropertiesConfigurationFactory<Map<String, Object>> factory =
new PropertiesConfigurationFactory<Map<String, Object>>(
new LinkedHashMap<String, Object>());
factory.setTargetName("info");
factory.setPropertySources(environment.getPropertySources());
Map<String, Object> infoMap = factory.getObject();
Infomap contiene un mapa con información de generación, incluyendo la versión del POM.
Lo encontré en la clase EndpointAutoConfiguration del proyecto spring-boot.
Algo no está completo acerca de esta respuesta, porque así el infoMap está vacío. No se encontró un fragmento de código similar en la ubicación del enlace. – Dennis
Para complementar lo @kieste ha publicado, que creo que es la mejor manera de tener Maven construir la información disponible en el código si está utilizando Primavera-arranque: la documentación en http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-application-info es muy útil.
Sólo tiene que activar los actuadores, y añadir las propiedades que necesita en su application.properties
o application.yml
Automatic property expansion using Maven
You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven ‘project properties’ via @[email protected] placeholders, e.g.
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
[email protected]@
[email protected]@
[email protected]@
[email protected]@
Esto es exactamente lo que estaba buscando, ¡gracias! – burcakulug
La respuesta aceptada puede ser el mejor y más estable forma de obtener un número de versión en una aplicación estáticamente, pero en realidad no responde la pregunta original: ¿Cómo recuperar el número de versión del artefacto de pom.xml? Por lo tanto, quiero ofrecer una alternativa que muestra cómo hacerlo dinámicamente en tiempo de ejecución:
Puede utilizar Maven sí. Para ser más exactos, puedes usar una biblioteca Maven.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
y luego hacer algo como esto en Java:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.FileReader;
import java.io.IOException;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader("pom.xml"));
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
El registro de la consola es el siguiente:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
Actualización 31/10/2017: En Para responder a la pregunta de seguimiento de Simon Sobisch, modifiqué el ejemplo así:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model;
if ((new File("pom.xml")).exists())
model = reader.read(new FileReader("pom.xml"));
else
model = reader.read(
new InputStreamReader(
Application.class.getResourceAsStream(
"/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
)
)
);
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
Gracias, justo lo que estaba buscando. – Kefirchiks
¡Esa es una manera genial y simple de hacerlo, gracias! –
Exactamente lo que estaba buscando. Gracias compañero. –
- 1. Maven pom.xml, SCM y versión
- 2. Múltiples archivos pom.xml maven
- 3. Módulos Maven opcionales en pom.xml
- 4. Complementos en Maven y POM.xml
- 5. cómo crear jar usando maven pom.xml
- 6. ¿Cómo excluir pom.xml de la guerra generada por Maven?
- 7. Maven genera archivos pom.xml duplicado y pom.properties en un frasco
- 8. Jerarquía de proyectos maven sin dispersar el número de versión
- 9. cómo controlar el pom.xml dentro del tarro construido por maven?
- 10. Herramienta para convertir Maven pom.xml a leiningen project.clj
- 11. Propagación de versión en Maven
- 12. versión mvn: realizar un error de una rama git: ¿el pom.xml necesita tener la misma versión en el maestro?
- 13. ¿Cómo obtener la parte principal de una versión de Maven?
- 14. ¿Podemos usar pom.xml en ANT
- 15. ¿Cómo recuperar la versión sdk de Android?
- 16. Quiero ejecutar comandos de shell desde pom.xml de Maven
- 17. Cómo descargar frascos de Maven Central sin escribir ningún pom.xml
- 18. ¿Cómo recuperar la versión de Scala en REPL?
- 19. error en pom.xml
- 20. Importar proyecto usando pom.xml
- 21. Maven sombra complemento añadiendo dependencia-reducido pom.xml al directorio base
- 22. Advertencia sobre el uso de project.parent.version como la versión de un módulo en Maven 3
- 23. ¿Cómo evito que Maven 2.x intente recuperar archivos pom.xml inexistentes para las dependencias de cada compilación?
- 24. Publicación de POM a través de Maven e insertando información de la versión de compilación
- 25. Pasar argumentos de la línea de comandos de Maven como propiedades en pom.xml
- 26. ¿La mejor manera de compartir partes de un pom.xml de Maven en proyectos no relacionados?
- 27. ¿Cuál es el orden de sobrescribir las propiedades de Maven en pom.xml y settings.xml?
- 28. Maven versión plugin: especificar el compilador Java versión
- 29. ¿Por qué Maven 3 abandona la aplicación de soporte $ declaración de la versión?
- 30. Actualice una versión de proyecto de Maven desde el script
Encontré un código [this] (http://stackoverflow.com/questions/2712970/get-maven-artifact-version-at-runtime) que no cambió la configuración de Maven. – Wendel