Apache Maven

Perfiles en Apache Maven

9 min lectura José Miguel

Apache Maven está diseñado para crear compilaciones portátiles que se espera que funcionen en diferentes plataformas y en varios entornos de tiempo de ejecución.

Puede haber situaciones en las que necesite construir el mismo proyecto de manera diferente. Por ejemplo, es posible que deba crear un proyecto de manera diferente con el fin de la puesta en escena y la producción. Es posible que no desee crear un proyecto que requiera una biblioteca de Linux en Windows, etc.

Para abordar estas circunstancias, Apache Maven admite perfiles de compilación. Como tal, los perfiles pueden conducir fácilmente a diferentes resultados de compilación de diferentes miembros de nuestro equipo. Sin embargo, si se usan correctamente, los perfiles se pueden usar mientras se preserva la portabilidad del proyecto.

Diferentes tipos de perfiles en Apache Maven

Existen diferentes tipos de perfiles que podemos emplear en Apache Maven:

  • Por proyecto: definido en el propio POM — pom.xml
  • Por usuario: definido en la configuración de Apache Maven — %USER_HOME%/.m2/settings.xml
  • Global: definido en la configuración global de Apache Maven — ${maven.home}/conf/settings.xml

Al crear diferentes perfiles para diferentes variaciones de la compilación del proyecto, puede usar el mismo archivo pom para crear diferentes compilaciones. Se debe tener cuidado para asegurarse de que esto no resulte en una compilación no portátil.

¿Cómo agregar un perfil de Apache Maven?

Hay dos formas de crear un perfil: en el archivo pom del proyecto o en el archivo de configuración. Es importante tener en cuenta que, si un perfil está activo desde el archivo de configuración, sus valores anularán cualquier perfil con ID equivalentes en el archivo pom.

Perfil en el archivo pom.xml

El perfil en el archivo pom.xml puede tener los siguientes elementos:

<profile>
    <id>...</id>
    <activation>...</activation>
    <build>
        <defaultGoal>...</defaultGoal>
        <finalName>...</finalName>
        <resources>...</resources>
        <testResources>...</testResources>
        <plugins>...</plugins>
    </build>
    <modules>...</modules>
    <dependencies>...</dependencies>
    <dependencyManagement>...</dependencyManagement>
    <distributionManagement>...</distributionManagement>
    <repositories>...</repositories>
    <pluginRepositories>...</pluginRepositories>
    <properties>...</properties>
    <reporting>...</reporting>
</profile>

Perfil en el archivo settings.xml

El perfil en el archivo settings.xml solo puede tener los siguientes elementos:

<profile>
    <id>...</id>
    <activation>...</activation>
    <repositories>...</repositories>
    <pluginRepositories>...</pluginRepositories>
    <properties>...</properties>
</profile>

Ejemplo práctico del trabajo con perfiles

Veamos en la práctica cómo trabajar con los perfiles. Creemos primero un proyecto Maven con el comando:

mvn archetype:generate -DgroupId=com.example -DartifactId=maven-profiles-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Luego agreguemos un perfil al proyecto agregando las siguientes líneas al pom del mismo:

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <environment>development</environment>
        </properties>
    </profile>
</profiles>

Una vez agregadas estas líneas vamos a dirigirnos dentro de la carpeta del proyecto y vamos a ejecutar el siguiente comando para poder ver los perfiles activos:

mvn help:active-profiles

Si es la primera vez que ejecutamos el comando veremos como se descargan una serie de archivos necesarios.

Podemos observar como no tenemos perfiles activos precisamente porque la etiqueta activeByDefault está como false. Cambiemos la etiqueta a true y volvamos a ejecutar el comando.

Observemos ahora como nos muestra como activo el perfil que hemos agregado al pom que en este caso le hemos llamado dev.

¿Cómo activar los perfiles?

Los perfiles se pueden activar de varias maneras. A continuación explicaremos algunas de ellas:

  • Explícitamente: Apache Maven proporciona una opción en la línea de comandos para invocar un perfil:
mvn package -P dev
  • A través de la configuración: se puede activar un perfil en el archivo de settings.xml configurando los perfiles que deseamos que estén activos de la siguiente manera:
<activeProfiles>
    <activeProfile>dev</activeProfile>
</activeProfiles>
  • Según la configuración del sistema operativo: el siguiente perfil solo se ejecutará en Windows:
<profile>
    <activation>
        <os>
            <family>Windows</family>
        </os>
    </activation>
    ...
</profile>
  • Por propiedad del sistema: se puede activar un perfil cuando una propiedad del sistema tiene un valor específico. Por ejemplo, el siguiente perfil se activará cuando se pase -Denvironment=production en la línea de comandos:
<profile>
    <id>production</id>
    <activation>
        <property>
            <name>environment</name>
            <value>production</value>
        </property>
    </activation>
    <properties>
        <db.url>jdbc:mysql://prod-server:3306/mydb</db.url>
    </properties>
</profile>

Para activarlo ejecutaríamos:

mvn package -Denvironment=production
  • Por ausencia de una propiedad: también es posible activar un perfil cuando una propiedad no está definida. Para ello se utiliza el prefijo ! antes del nombre de la propiedad:
<profile>
    <id>default-config</id>
    <activation>
        <property>
            <name>!skipDefaults</name>
        </property>
    </activation>
    ...
</profile>

Este perfil estará activo siempre que no se pase -DskipDefaults en la línea de comandos.

Desactivar un perfil

En ocasiones es necesario desactivar un perfil que está activo por defecto o que se activa automáticamente. Para ello, Maven permite usar el prefijo ! o - antes del nombre del perfil en la línea de comandos:

mvn package -P !dev

Este comando ejecutará la fase package asegurándose de que el perfil dev no esté activo, incluso si tiene activeByDefault configurado como true.

Múltiples perfiles simultáneos

Maven permite activar varios perfiles al mismo tiempo separándolos por comas:

mvn package -P dev,integration

Esto resulta útil cuando se necesitan combinar configuraciones. Por ejemplo, un perfil dev podría definir la base de datos de desarrollo, mientras que un perfil integration podría agregar dependencias de pruebas de integración. Ambos se aplicarán en orden y sus propiedades se combinarán.

También es posible mezclar activaciones y desactivaciones en el mismo comando:

mvn package -P integration,!dev

Buenas prácticas al usar perfiles

Al trabajar con perfiles en Apache Maven, es importante seguir ciertas prácticas para mantener la calidad y portabilidad de nuestros proyectos:

  • No romper la portabilidad: El objetivo principal de Maven es la portabilidad. Los perfiles deben usarse para adaptar la compilación a diferentes entornos, no para crear compilaciones que solo funcionen en una máquina específica. El proyecto debe poder compilarse sin necesidad de activar ningún perfil.
  • Documentar los perfiles: Cada perfil debe tener un propósito claro. Utilice comentarios XML en el pom.xml para explicar cuándo y por qué se debe usar cada perfil.
  • Usar propiedades en lugar de valores directos: En lugar de duplicar configuraciones completas entre perfiles, defina propiedades que cambien según el perfil y referencie esas propiedades en el resto del pom:
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <db.url>jdbc:mysql://localhost:3306/devdb</db.url>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <db.url>jdbc:mysql://prod-server:3306/proddb</db.url>
        </properties>
    </profile>
</profiles>
  • Evitar activeByDefault en múltiples perfiles: Si más de un perfil tiene activeByDefault como true, todos se activarán simultáneamente, lo cual puede causar conflictos inesperados. Limite su uso a un solo perfil por defecto.
  • Preferir activación por propiedad: La activación por propiedad del sistema (-Dproperty=value) es la más explícita y predecible. Hace evidente en el comando de compilación qué configuración se está utilizando.

Errores comunes al trabajar con perfiles

  • Asumir que un perfil está activo: Un error frecuente es olvidar activar un perfil y asumir que la compilación usará la configuración esperada. Siempre verifique los perfiles activos con mvn help:active-profiles.
  • Conflictos entre perfiles: Cuando dos perfiles definen la misma propiedad con valores diferentes y ambos están activos, el último en procesarse gana. Esto puede generar resultados impredecibles.
  • Dependencias exclusivas de un perfil: Si una dependencia solo se declara dentro de un perfil y alguien compila sin activarlo, la compilación fallará. Asegúrese de que la compilación base (sin perfiles) sea funcional.
  • No usar mvn help:active-profiles: Este comando es indispensable para depurar problemas relacionados con perfiles. Muestra exactamente qué perfiles están activos y por qué.

Conclusión

Los perfiles en Apache Maven son una herramienta poderosa para manejar diferentes configuraciones de compilación dentro de un mismo proyecto. Permiten adaptar el comportamiento de Maven según el entorno, el sistema operativo o las necesidades específicas del equipo de desarrollo, todo sin sacrificar la portabilidad del proyecto.

La clave está en usarlos con moderación y siguiendo buenas prácticas: documentar su propósito, evitar romper la compilación base y preferir mecanismos de activación explícitos. Con estos principios, los perfiles se convierten en un aliado fundamental para gestionar proyectos Maven en entornos profesionales.

José Miguel Moya Curbelo
José Miguel Moya Curbelo
Senior Data Engineer & Big Data Instructor

MSc Applied Mathematics · AWS Cloud Practitioner · SCRUM Master. Especializado en arquitecturas de datos de alto rendimiento con Apache Spark, Snowflake, Python y Scala.

Conectar en LinkedIn

Artículos Relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada.