Maven Properties

De ChuWiki


Maven proporciona ciertas propiedades predefinidas que podemos usar o modificar en nuestro fichero pom.xml. Nos da acceso también a variables de entorno del sistema y propiedades definidas en Java. Nos permite además crear nuestras propias propiedades para usarlas a lo largo del fichero pom.xml

Los tipos de propiedades que hay son:

  • ${project.*} para acceder a propiedades definidas en el POM efectivo de nuestro proyecto. Es decir, la suma del pom por defecto de Maven más lo que hayamos puesto en nuestro pom.xml
  • ${settings.*} para acceder a propiedades definidas en el fichero de configuración de maven settings.xml
  • ${maven.*} Algunas propiedades específicas de maven, como el timestamp del build, el directorio home de maven o la versión de maven.
  • ${env.*} para acceder a variables de entorno del sistema operativo
  • ${*} para acceder a propiedades java que podemos obtener con System.getProperties()
  • ${*} para propiedades que definamos nosotros mismos.

Estas propiedades son útiles a veces para configuraciones en el pom.xml. En vez de poner un valor fijo, podemos poner una propiedad. Sobre todo, suele ser útil en configuración de plugins de maven.

Vamos primero con las definidas por nosotros mismos, porque suelen ser las más útiles

Maven User Properties[editar]

Estas son las más interesantes, porque podemos definir y usar las que queramos. Para definirlas hay varias opciones. Las más habituales:

  • Con -D en la línea de comandos de maven
  • Dentro del pom.xml

Un ejemplo de la primera. El comando mvn help:evaluate nos da el valor de una property en nuestro proyecto.

C:\Users\fjabe\MiProyecto> mvn -DmyProperty=Hi! help:evaluate
...
[INFO] Enter the Maven expression i.e. ${project.groupId} or 0 to exit?:
${myProperty}
[INFO]
Hi!

Podríamos usar en nuestro pom.xml la propiedad así definida como ${myProperty}

Vamos con la segunda forma, porque suele ser más útil. Imagina que estamos con un proyecto que usa Spring y tenemos varias dependencias maven que son de distintos jar de spring, todos de la misma versión. Nos tocaría repetir el número de versión en todas las dependencias. Si más adelante queremos cambiar de versión de Spring, nos toca cambiar todos los números de dependencias.

La solución fácil es definir una propiedad con cualquier nombre, por ejemplo spring.version en el pom.xml, así

<project>
   ...
   <properties>
      <spring.version>6.0.13</spring.version>
	</properties>
   ...
</project>

Y una vez definida, podemos usarla en el resto de nuestro pom.xml.

<dependencies>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
      <scope>compile</scope>
   </dependency>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
      <scope>compile</scope>
   </dependency>
   ...
</dependencies>

Fíjate que hemos puesto ${spring.version} en vez de el número de versión. Si más adelante queremos cambiar de versión, sólo tenemos que cambiar el valor de la versión donde hemos definido la property.

Maven project properties[editar]

Por norma general, el nombre de las property de project se pueden obtener siguiendo la estructura XML del fichero pom.xml. Más concretamente, del POM efectivo de nuestro proyecto. El comando maven help:effective-pom nos muestra en pantalla este POM efectivo

C:\Users\fjabe\MiProyectoMaven\>mvn help:effective-pom
...
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.chuidiang.ejemplos</groupId>
  <artifactId>ejemplo-hibernate-annotations</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>ejemplo-hibernate-annotations</name>
  <url>https://chuidiang.org</url>
  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.hibernate.orm</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>6.3.1.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.postgresql</groupId>
...

Siguiendo la estructura de tag XML, tenemos las propiedades. Por ejemplo, ${project.modelVersion}, ${project.groupId}, ${project.artifactId}, etc. Incluso con más niveles de anidamiento ${project.build.sourceDirectory}, ${project.build.directory}, etc.

Ponemos aquí algunas de las más habituales de uso

Maven Project Properties
Propiedad Descripción
${project.basedir} Directorio donde está nuestro pom.xml
${project.groupId} groupId de nuestro proyecto.
${project.artifactId} artifactId de nuestro proyecto.
${project.version} Version de nuestro proyecto maven
${project.build.finalName} Nombre del jar que va a generar nuestro proyecto. Suele coincidir con ${project.artifactId} si no lo cambiamos.
${project.build.directory} Directorio donde maven construye nuestro proyecto, por defecto target
${project.build.sourceDirectory} Directorio donde están nuestros fuentes, habitualmente src/main/java

Con mvn help:evaluate podemos ver el valor de estas propiedades

C:\Users\fjabe\MiProjecto>mvn help:evaluate
...
[INFO] Enter the Maven expression i.e. ${project.groupId} or 0 to exit?:
${project.build.finalName}
[INFO] 
ejemplo-hibernate-1.0-SNAPSHOT

Maven Settings Properties[editar]

De la misma manera que ${project.*} navega por el XML del POM efectivo de nuestro proyecto, ${settings.*} lo hace por el fichero settings.xml de configuración de maven. Ponemos solo una a modo de ejemplo

Maven Project Properties
Propiedad Descripción
${settings.localRepository} Directorio donde está nuestro repositorio local de maven
[INFO] Enter the Maven expression i.e. ${project.groupId} or 0 to exit?:
${settings.localRepository}
[INFO] 
C:\Users\fjabe\.m2\repository

Maven Properties[editar]

Esta son específicas de nuestra instalación de maven o de utilidad.

Maven Properties
Propiedad Descripción
${maven.build.timestamp} Timestamp del build de nuestro proyecto
${maven.build.timestamp.format} Formato para mostrar el timestamp anterior. Por defecto yyyy-MM-dd'T'HH:mm:ss'Z'
${maven.home} Directorio de instalación de Maven.
${maven.version} Version de maven
[INFO] Enter the Maven expression i.e. ${project.groupId} or 0 to exit?:
${maven.version}
[INFO] 
3.6.3

Maven env Properties[editar]

Cualquier variable de entorno definida en nuesro sistema operativo

[INFO] Enter the Maven expression i.e. ${project.groupId} or 0 to exit?:
${env.JAVA_HOME}
[INFO]
C:\Program Files\Zulu\zulu-17\

Maven Java System Properties[editar]

Propiedades definidas en Java, que se pueden obtener con System.getProperties(). En la API de la clase System tienes el listado completo de java properties.

[INFO] Enter the Maven expression i.e. ${project.groupId} or 0 to exit?:
${java.version}
[INFO] 
17.0.8.1