2011-01-13 12 views
27

Necesito modificar la compilación maven para un proyecto grande para omitir ciertos pasos durante las compilaciones de desarrollo típicas (es decir, no compilar los archivos * -source.jar). He buscado "ejecución condicional" para maven, pero no he encontrado nada.Usar perfiles maven para controlar la ejecución de compilación

Un perfil de desarrollo suena como la forma intuitiva de hacerlo, pero no sé qué tan intuitivo es Maven. Los documentos para perfiles muestran cómo establecer diferentes propiedades (es decir, parámetros de conexión de base de datos) para diferentes perfiles. Supongo que podría establecer una propiedad y luego probar si esa propiedad está configurada en la etiqueta maven-source-plugin-executions-execution.

¿Es esta la manera correcta de realizar una ejecución condicional en maven?

¿Cuál es la forma "correcta" de hacer esto en maven?

Respuesta

33

Lo estás pensando un poco al revés: el perfil habilita el comportamiento, no lo deshabilita. Este es el mejor perfil en los perfiles, y es exactamente su caso: solo desea que los pasos se ejecuten en determinadas circunstancias. Por lo que podría tener algo como:

<profile> 
    <id>source-jars</id> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 

Y de hecho, hay un ejemplo como este en el maven-source-plugin usage page. Cuando necesite generar su artefacto, use mvn -P source-jar (o lo que sea). ¡Eso es! Si solo necesita hacer esto en el momento del lanzamiento, el release plugin incluso ofrece una forma de definir los perfiles a usar directamente en la configuración del complemento de lanzamiento.

+0

Nuestros poms están escritos donde maven-source-plugin se ejecuta de forma predeterminada, así que tendré que reestructurarlos como sugieres. –

+3

Hay muchos casos en los que es deseable que los complementos se activen de manera predeterminada y se inhabiliten mediante el uso de un perfil. Creo que esta respuesta evita el problema sin resolverlo. – Kevin

+1

@Mowgli Pero el sistema de perfiles maven no es adecuado para eso: solo hay un mecanismo de "activación", no un mecanismo de "desactivación". Algunos complementos manejan esto creando un mecanismo de desactivación propio (por ejemplo, skipTests for surefire plugin). –

6

Puede lograr su objetivo real de habilitar el plugin source-jars de forma predeterminada agregando dos perfiles a su POM. Los Maven profiles documentation notas que se pueden agregar un elemento <activeByDefault>true</activeByDefault> a la sección activation y afirma que

Este perfil se activa automáticamente para todas las versiones menos otro perfil en la misma POM se activa mediante uno de los métodos descritos anteriormente

Puede agregar dos perfiles, uno activeByDefault, que incluye el complemento correspondiente, y otro que se puede activar de cualquiera de las formas estándar (como -P desde la línea de comandos) para evitar el valor predeterminado perfil de ejecución. Por lo tanto, la sección profiles en sus pom.xml (o ajustes de Maven o lo que sea) podría tener este aspecto:

<profile> 
    <id>source-jars</id> 
    <activation> 
    <activeByDefault>true</activeByDefault> 
    </activation> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 
     </plugin> 
    </plugins> 
    </build> 
</profile> 
<profile> 
    <!-- active this profile to disable the source-jars plugin --> 
    <id>no-optional-plugins</id> 
</profile> 

Por desgracia, no puedo ver una manera de hacer este método se adapta bien para controlar múltiples plugins - Creo que se necesita O(n^2) perfiles para n complementos, pero para este simple caso debería funcionar bien.

Otra opción más simple, posiblemente con Maven ≥ 2.0.10 es simplemente tener el perfil source-jars desde arriba (todavía activeByDefault), y para manually deactivate the profile cuando se quiere anteponiendo el ID de perfil con - o ! después de la bandera -P CLI:

Este método no tiene los mismos problemas O(n^2) con varios complementos, pero también es menos flexible, ya que la desactivación no puede ser activada por una propiedad del sistema, una variable de entorno, una versión JDK, etc.

+0

gracias, este ejemplo que me diste realmente me ayudó – Hoto

Cuestiones relacionadas