Diferentes dependencias para diferentes perfiles de construcción

115

¿Es posible tener un conjunto diferente de dependencias en un archivo maven pom.xml para diferentes perfiles?

p.ej

mvn -P debug
mvn -P release

Me gustaría elegir un archivo jar de dependencia diferente en un perfil que tenga los mismos nombres de clase y diferentes implementaciones de las mismas interfaces.

izb
fuente
Esto se puede utilizar cuando se dirige a diferentes servidores web. Por ejemplo, al compilar para un servidor JavaEE 5, que ofrece bibliotecas como JAXB, que no debe incluir en su archivo war, en lugar de compilar para un servidor JavaEE 1.4, donde debe incluir el jar JAXB.
Leonel

Respuestas:

174

Para citar la documentación de Maven sobre esto :

Un elemento de perfil contiene una activación opcional (un activador de perfil) y el conjunto de cambios que se realizarán en el POM si ese perfil se ha activado. Por ejemplo, un proyecto creado para un entorno de prueba puede apuntar a una base de datos diferente a la de la implementación final. O las dependencias se pueden extraer de diferentes repositorios según la versión de JDK utilizada .

(El énfasis es mío)

Simplemente coloque la dependencia para el releaseperfil dentro de la declaración del perfil y haga lo mismo para debug.

<perfiles>
    <perfil>
        <id> depurar </id>
        ...
        <dependencias>
            <dependency>… </dependency>
        </dependencias>
        ...
    </perfil>
    <perfil>
        <id> lanzamiento </id>
        ...
        <dependencias>
            <dependency>… </dependency>
        </dependencias>
        ...
    </perfil>
</perfiles>
Aleksandar Dimitrov
fuente
2
Este método hará que el código no se resuelva en el modo de edición. Si la depuración está activa, faltará el contenedor de dependencia de la versión y el código será un error. ¿Como resolverlo?
brucenan
6
puede establecer el alcance de la dependencia específica de la versión como 'proporcionado' en la jerarquía de dependencias y restablecer el alcance a 'compilar' en la sección de perfil de la versión. De modo que la dependencia está disponible para la compilación pero no en la guerra final para el perfil de 'depuración'.
uday
@uday Si pudiera dar una respuesta que muestre ese enfoque, me encantaría
votarlo a favor
En mi humilde opinión, los perfiles son inútiles, al menos para las dependencias: los IDE dan errores, las dependencias dejan de resolverse, las aplicaciones no funcionan al final. Esperaba más.
Ares
6

Su groupId, artifactId debe estar tokenizado en sus perfiles como propiedades y puede mover sus dependencias a la sección genérica.


fuente
2
Este solo sería el caso si tiene 1 dependencia. Si el número de dependencias difiere entre la depuración y la versión, la tokenización no funcionará. Para el caso, recomendaría no tokenizar y definir explícitamente los departamentos en la sección de perfil.
Marcel Overdijk
La otra respuesta no funcionó para mí, ya que las dependencias de perfil predeterminadas todavía se incluían junto con otras dependencias de perfil específicas. Tu respuesta funcionó bien.
Vlad Mihalcea
@Vlad ¿Eliminó la dependencia del cuerpo principal del POM? De lo contrario, lo tendrás dos veces. (Consulte stackoverflow.com/q/24855678/6944068 sobre cómo asegurarse de que un perfil esté siempre activo)
Toolforger