2011-03-15 14 views
79

Tengo un perfil en mi pom.xml que debe estar siempre activo a menos que esté explícitamente desactivado (-P! FirstProfile). I resuelto mediante el uso de la bandera activeByDefault:¿Cómo mantener activos los perfiles de Maven activos por defecto, incluso si se activa otro perfil?

<profiles> 
    <profile> 
    <id>firstProfile</id> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
    ... 
    </profile> 
</profiles> 

Ahora en el mismo pom.xml que tienen un segundo perfil definido esto sólo debe estar activo si el perfil es muy activa (-P secondProfile). Entonces el comportamiento predeterminado es: firstProfile active, secondProfile inactive. En otro momento me gustaría activar el segundo perfil además del primer perfil. Ahora el problema es que si hago eso con "-P secondProfile", desafortunadamente el primer perfil se desactiva. La documentación Maven esto:

... Este perfil será automáticamente activa para todas construye a menos que otro perfil en la misma POM se activa utilizando uno de los métodos anteriormente descritos . Todos los perfiles que están activos de forma predeterminada son automáticamente desactivados cuando se activa un perfil en el POM en la línea de comandos o a través de su configuración de activación. ...

¿Hay alguna manera una posibilidad de cómo mantener la firstProfile siempre activa (sin tener que declararlo en el settings.xml)?

+0

Consulte también [¿El uso de activeByDefault va en contra de las mejores prácticas de maven?] (Http://stackoverflow.com/questions/16167206/does-using-activebydefault-go-against-best-practices) – Vadzim

Respuesta

17

Ojalá hubiera tal posibilidad, a menudo me la perdí. El único problema JIRA relevante que pude encontrar es éste:

MNG-4917: Profile not active even though it has activeByDefault set to true

Y se ha resuelto lo Not A Problem.

He dejado de usar activeByDefault, porque este enfoque de "todo o nada" no me valió nada.


La única manera de cambiar este comportamiento es escribir su propio reemplazo para DefaultProfileSelector, registrarlo como un componente del plexo con @Component(role = ProfileSelector.class) y ponerlo en ${MAVEN_HOME}/lib/ext (de esa manera será recogido como selector de perfil por defecto). (Si está utilizando Maven 3.0.2 o más también tendrá que editar ${MAVEN_HOME}/bin/m2.conf para cargar lib/ext antes de cargar lib)

+0

Una alternativa agradable- to-have, sería una herencia de perfil o decoradores de perfil, permitiendo que las configuraciones base sean reutilizadas. – crowne

+0

@crowne definitivamente, sí. ¿Por qué no sugerir eso como una solicitud de función? –

+0

Esto está relacionado ... Algo que me gusta hacer es agregar todos los módulos a un perfil activo por defecto porque pensé que no había forma de eliminar un módulo de la ejecución. En 3.2.1 agregaron esto como se muestra [aquí] (http://stackoverflow.com/a/22783633/1858327). Dejo este comentario en caso de que alguien tropiece aquí y esté usando módulos por una razón similar a la mía. –

3

Simplemente puede enumerar todos los perfiles que desea que se active en la línea de comandos como tal:

-P perfil-1, perfil-0

maven fue diseñado para permitir la activación de múltiples perfiles automáticamente, si lo reemplaza con el -P, entonces solo se activan los perfiles enumerados en el parámetro.

+5

Eso no es del todo cierto. La activación manual de perfiles con '-P' solo desactiva los perfiles' '. Los perfiles activados por '' en 'settings.xml' o por cualquier otro tipo de' 'permanecen activos a menos que estén desactivados explícitamente. –

114

Un truco es evitar activeByDefault, y en lugar de activar el perfil por la ausencia de una propiedad, por ejemplo:

<profiles> 
    <profile> 
    <id>firstProfile</id> 
    <activation> 
     <property> 
     <name>!skipFirstProfile</name> 
     </property> 
    </activation> 
    ... 
    </profile> 
</profiles> 

A continuación, debería ser capaz de desactivar el perfil con -DskipFirstProfile o con -P !firstProfile, pero por lo demás el perfil estará activo.

Ver: Maven: The Complete Reference, Profile Activation - Activation by the Absence of a Property

+0

¿Bajo qué circunstancias es útil o mejor que mencionar explícitamente el perfil en sí? es decir, en lugar de pasar en -DmyFlag puedo hacerlo -PmyDefaultProfile ¿verdad? ¿Hay algún beneficio para controlarlo con una bandera que me falta? – Chetya

+1

Porque el perfil está activo automáticamente cuando la bandera es * no * allí. El perfil 'firstProfile' está deshabilitado solo si especifica' -DskipFirstProfile' (p. Ej. 'Mvn verify -DskipFirstProfile'). – seanf

0

No se puede mantener el perfil predeterminado activo, pero se puede tomar el contenido de ese perfil (el ... en su ejemplo) y acaba de moverlo a la sección principal del POM .

El hecho de que esté usando perfiles no significa que todo lo que hace debe estar dentro de un perfil.

1

Esta pregunta es antigua, pero parece que el problema se puede resolver utilizando activeProfile en lugar de activeByDefault. Estoy en Maven 3.3.9, pero la solución puede funcionar en versiones anteriores.

Basta con enumerar a cabo su activeProfiles en su settings.xml, así:

<settings> 
    <profiles> 
    [...] 
    </profiles> 
    <activeProfiles> 
    <activeProfile>my-awesome-profile</activeProfile> 
    </activeProfiles> 
</settings> 

En my-awesome-profile tengo ajustes como URL base de datos y así sucesivamente, por lo que siempre aplicar. Aquí, activo un segundo perfil, resolve-from-central:

$ mvn help:all-profiles -P resolve-from-central 
[INFO] Scanning for projects... 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Maven Stub Project (No POM) 1 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-help-plugin:2.2:all-profiles (default-cli) @ standalone-pom --- 
[INFO] Listing Profiles for Project: org.apache.maven:standalone-pom:pom:1 
    Profile Id: resolve-from-central (Active: true , Source: settings.xml) 
    Profile Id: my-awesome-profile (Active: true , Source: settings.xml) 
    Profile Id: resolve-from-internal (Active: false , Source: settings.xml) 

Observe cómo my-awesome-profile sigue activo. ¡Hurra!

Cuestiones relacionadas