¿Cómo mantener activos los perfiles de Maven que están activeByDefault incluso si se activa otro perfil?

113

Tengo un perfil en mi pom.xml que debería estar siempre activo a menos que esté desactivado explícitamente (-P! FirstProfile). Resolví esto usando la bandera activeByDefault:

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

Ahora en el mismo pom.xml tengo un segundo perfil definido que solo debería estar activo si el perfil está realmente activado (-P secondProfile). Así que el comportamiento predeterminado es: firstProfile active, secondProfile inactive. En algún 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", el firstProfile desafortunadamente se desactiva. La documentación de Maven dice esto:

... Este perfil se activará automáticamente para todas las compilaciones a menos que se active otro perfil en el mismo POM utilizando uno de los métodos descritos anteriormente. Todos los perfiles que están activos por defecto se desactivan automáticamente cuando se activa un perfil en el POM en la línea de comando o mediante su configuración de activación. ...

¿Existe de alguna manera la posibilidad de mantener el firstProfile siempre activo (sin tener que declararlo en settings.xml)?

Pedro
fuente

Respuestas:

153

Un truco es evitar activeByDefaulty, en cambio, 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 poder desactivar el perfil con -DskipFirstProfile o con -P !firstProfile, pero de lo contrario, el perfil estará activo.

Ver: Maven: La referencia completa, Activación de perfil - Activación por ausencia de una propiedad

seanf
fuente
¿En qué circunstancias es esto útil o mejor que mencionar explícitamente el perfil en sí? es decir, en lugar de pasar -DmyFlag puedo hacer -PmyDefaultProfile, ¿verdad? ¿Hay algún beneficio en controlarlo con una bandera que me falta?
Chetya
1
Porque el perfil se activa automáticamente cuando la bandera no está ahí. El perfil firstProfileestá deshabilitado solo si lo especifica -DskipFirstProfile(por ejemplo mvn verify -DskipFirstProfile).
seanf
25

Ojalá existiera esa posibilidad, a menudo la he perdido. El único problema relevante de JIRA que pude encontrar es este:

MNG-4917: Perfil no activo a pesar de que activeByDefault establecido en verdadero

Y se ha resuelto como Not A Problem.

Dejé de usarlo activeByDefaultporque este enfoque de "todo o nada" lo hacía inútil para mí.


La única forma de cambiar este comportamiento es escribir su propio reemplazo DefaultProfileSelector, registrarlo como un componente de plexus @Component( role = ProfileSelector.class )y colocarlo ${MAVEN_HOME}/lib/ext(de esa manera se seleccionará como selector de perfil predeterminado). (Si está usando Maven 3.0.2 o anterior, también tendrá que editar ${MAVEN_HOME}/bin/m2.confpara cargar lib/extantes de que se cargue lib)

Sean Patrick Floyd
fuente
Una alternativa interesante sería la herencia de perfiles o los decoradores de perfiles, lo que permite reutilizar las configuraciones base.
Crowne
@crowne definitivamente, sí. ¿Por qué no sugerirlo como una solicitud de función?
Sean Patrick Floyd
Esto es algo relacionado ... Una cosa que me gusta 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í . Dejo este comentario en caso de que alguien tropiece aquí y esté usando módulos por una razón similar a la mía.
Captain Man
10

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

Simplemente enumere su activeProfilesen su settings.xml, así:

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

En my-awesome-profiletengo configuraciones como URL de base de datos, etc., por lo que siempre se aplican. 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-profilesigue activo. ¡Hurra!

inanutshellus
fuente
4

Simplemente puede enumerar todos los perfiles que desea activar en la línea de comando como tal:

-P perfil-1, perfil-2

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

Assem
fuente
7
Eso no es del todo cierto. La activación manual de perfiles con -Psolo desactiva <activeByDefault>perfiles. Los perfiles activados por <activeProfiles>en settings.xmlo por cualquier otro tipo de <activation>permanecen activos a menos que se desactiven explícitamente.
Sam Hanes
4

Los perfiles son una buena forma de poner orden en POM. Especialmente si usa varias ejecuciones del mismo complemento para diferentes propósitos.

Usando archivos:

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><exists>.</exists></file>
    </activation>
    ...
</profile>

Esto siempre será cierto (a menos que alguien elimine el directorio durante el arranque de Maven :). Probado con Maven 3.6.0.

También podría ser una buena forma de diferenciar entre tipos de proyectos. Por ejemplo, mi proyecto siempre ha estado module.jsonpresente.

Usar una extensión de activación de perfil

Hay algunas extensiones de Maven para la activación de perfiles. Uno de ellos en una bifurcación aquí:
https://github.com/OndraZizka/el-profile-activator-extension

Ondra Žižka
fuente
1
pequeña corrección parece ser<file><exists>.</exists></file>
revau.lt
-1

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

El hecho de que esté utilizando perfiles no significa que todo lo que esté haciendo deba estar dentro de un perfil.

Daniel Stolz
fuente
Esto no responde a la pregunta: OP establece explícitamente que el perfil debe estar "siempre activo a menos que esté desactivado explícitamente". Es de suponer que existe la necesidad de deshabilitarlo explícitamente a veces, lo que esta respuesta no permite.
sleske