He notado que en el JAR de un artefacto Maven, el atributo project.version está incluido en dos archivos:
META-INF/maven/${groupId}/${artifactId}/pom.properties
META-INF/maven/${groupId}/${artifactId}/pom.xml
¿Hay alguna forma recomendada de leer esta versión en tiempo de ejecución?
Respuestas:
No debería necesitar acceder a archivos específicos de Maven para obtener la información de versión de una biblioteca / clase determinada.
Simplemente puede usar
getClass().getPackage().getImplementationVersion()
para obtener la información de la versión que se almacena en un archivo .jarMANIFEST.MF
.Afortunadamente, Maven es lo suficientemente inteligente ¡Desafortunadamente, Maven no escribe la información correcta en el manifiesto también de forma predeterminada!En cambio, uno tiene que modificar el
<archive>
elemento de configuración demaven-jar-plugin
estableceraddDefaultImplementationEntries
yaddDefaultSpecificationEntries
paratrue
, de esta manera:Idealmente, esta configuración se debe poner en la empresa
pom
u otra base-pom.La documentación detallada del
<archive>
elemento se puede encontrar en la documentación del Archivo Maven .fuente
Para seguir la respuesta anterior, para un
.war
artefacto, descubrí que tenía que aplicar la configuración equivalente amaven-war-plugin
, en lugar demaven-jar-plugin
:Esto agregó la información de la versión
MANIFEST.MF
en el proyecto.jar
(incluido enWEB-INF/lib
el.war
)fuente
null
aunque el MANIFEST.MF en los archivos de guerra contiene la información correcta.<archiveClasses>true</archiveClasses>
, y funciona de manera confiable desde entonces.Aquí hay un método para obtener la versión de pom.properties, recurriendo a obtenerla del manifiesto
fuente
Pasé algún tiempo en los dos enfoques principales aquí y no funcionaron para mí. Estoy usando Netbeans para las compilaciones, puede que haya más cosas allí. Tuve algunos errores y advertencias de Maven 3 con algunas construcciones, pero creo que fueron fáciles de corregir. No es problema.
Encontré una respuesta que parece fácil de mantener y de implementar en este artículo en DZone:
Ya tengo una subcarpeta recursos / config, y llamé a mi archivo: app.properties, para reflejar mejor el tipo de cosas que podemos guardar allí (como una URL de soporte, etc.).
La única advertencia es que Netbeans advierte que el IDE necesita filtrado. No estoy seguro de dónde / cómo. No tiene ningún efecto en este momento. Quizás haya una solución para eso si necesito cruzar ese puente. La mejor de las suertes.
fuente
Estoy usando
maven-assembly-plugin
para mi empaque maven. El uso de Apache Maven Archiver en la respuesta de Joachim Sauer también podría funcionar:Debido a que archiever es uno de los componentes compartidos de maven , podría ser utilizado por múltiples complementos de construcción de maven, lo que también podría tener conflictos si se introducen dos o más complementos, incluida la
archive
configuración interna.fuente
Para que esto funcione en Eclipse, así como en una compilación de Maven, debe agregar las entradas
addDefaultImplementationEntries
yaddDefaultSpecificationEntries
pom como se describe en otras respuestas, luego use el siguiente código:Si su compilación Java coloca clases de destino en otro lugar que no sea "target / classes", entonces es posible que deba ajustar el valor de segmentosToRemove.
fuente
System.getProperty("user.dir")/pom.xml
. Estoy bastante seguro de que también lo hará para otras cosas, excepto tal vez no para WTP..getResource()
o.getResourceAsStream()
.En mi aplicación de arranque de primavera, la solución de la respuesta aceptada funcionó hasta que recientemente actualicé mi jdk a la versión 12. Intenté todas las otras respuestas también y no pude hacer que eso funcionara.
En ese momento, agregué la línea a continuación a la primera clase de mi aplicación de arranque de primavera, justo después de la anotación
@SpringBootApplication
Más tarde, uso lo siguiente para obtener el valor del archivo de propiedades en la clase en la que quiero usar su valor y me
appVersion
da la versión del proyecto:Espero que ayude a alguien.
fuente
Una solución simple que es compatible con Maven y funciona para cualquier clase (por lo tanto, también de terceros):
fuente
Variante de Java 8 para EJB en archivo war con proyecto maven. Probado en EAP 7.0.
fuente