2010-09-13 10 views

Respuesta

170

Suponiendo que está usando Java, puede

  1. 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).

  2. 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}

  3. 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).

  4. 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.

+1

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

59

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.

+7

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

32

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.

+11

-1 - Esta solución no funcionó para mí; el valor de 'getImplementationVersion()' era 'null'. (versión 3.0.4 de maven) –

+7

dependiendo de la fase ...solo funciona cuando el artefacto está siendo empaquetado, por lo que no funciona en pruebas unitarias: -/ – wikier

+0

Para artefactos '.war', recuerde usar' maven-war-plugin' en lugar de 'maven-jar-plugin' –

4

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")); 

http://manifests.jcabi.com/index.html

11

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.

2

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.

@see https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java

+0

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

10

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]@ 
+0

Esto es exactamente lo que estaba buscando, ¡gracias! – burcakulug

35

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()); 
    } 
} 
+0

Gracias, justo lo que estaba buscando. – Kefirchiks

+0

¡Esa es una manera genial y simple de hacerlo, gracias! –

+0

Exactamente lo que estaba buscando. Gracias compañero. –

Cuestiones relacionadas