Come mantenere attivi i profili Maven che sono activeByDefault anche se viene attivato un altro profilo?


113

Ho un profilo nel mio pom.xml che dovrebbe essere sempre attivo a meno che non sia esplicitamente disattivato (-P! FirstProfile). Ho risolto questo problema utilizzando il flag activeByDefault:

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

Ora nello stesso pom.xml ho un secondo profilo definito che dovrebbe essere attivo solo se il profilo è realmente attivato (-P secondProfile). Quindi il comportamento predefinito è: firstProfile attivo, secondProfile inattivo. Ad un altro punto vorrei attivare il secondo profilo oltre al primo profilo. Il problema è che se lo faccio con "-P secondProfile" il firstProfile purtroppo viene disattivato. La documentazione di Maven afferma questo:

... Questo profilo sarà automaticamente attivo per tutte le build a meno che un altro profilo nello stesso POM non venga attivato utilizzando uno dei metodi descritti in precedenza. Tutti i profili attivi per impostazione predefinita vengono disattivati ​​automaticamente quando un profilo nel POM viene attivato sulla riga di comando o tramite la sua configurazione di attivazione. ...

C'è in qualche modo una possibilità come mantenere il firstProfile sempre attivo (senza doverlo dichiarare nel settings.xml)?


Risposte:


153

Un trucco è evitare activeByDefault, e invece attivare il profilo dall'assenza di una proprietà, ad esempio:

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

Dovresti quindi essere in grado di disattivare il profilo con -DskipFirstProfile o con -P !firstProfile, ma altrimenti il ​​profilo sarà attivo.

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


In quali circostanze è utile o migliore che menzionare esplicitamente il profilo stesso? cioè invece di passare in -DmyFlag posso fare -PmyDefaultProfile giusto? C'è qualche vantaggio nel controllarlo con un flag che mi manca?
Chetya,

1
Perché il profilo è attivo automaticamente quando il flag non è presente. Il profilo firstProfileè disabilitato solo se si specifica -DskipFirstProfile(es mvn verify -DskipFirstProfile.).
seanf

25

Vorrei che ci fosse una tale possibilità, spesso l'ho persa. L'unico problema JIRA rilevante che ho trovato è questo:

MNG-4917: profilo non attivo anche se ha activeByDefault impostato su true

Ed è stato risolto come Not A Problem.

Ho smesso di usarlo activeByDefault, perché questo approccio "tutto o niente" lo rendeva inutile per me.


L'unico modo per modificare questo comportamento è scrivere il proprio sostituto DefaultProfileSelector, registrarlo come componente plexus con @Component( role = ProfileSelector.class )e inserirlo ${MAVEN_HOME}/lib/ext(in questo modo verrà scelto come selettore di profilo predefinito). (Se stai usando Maven 3.0.2 o versioni precedenti, dovrai anche modificare ${MAVEN_HOME}/bin/m2.confper caricare lib/extprima che venga caricato lib)


Un'alternativa piacevole da avere, sarebbe l'ereditarietà del profilo o i decoratori del profilo, che consentono di riutilizzare le configurazioni di base.
crowne

@crowne decisamente, sì. Perché non suggerirlo come richiesta di funzionalità?
Sean Patrick Floyd

Questo è in qualche modo correlato ... Una cosa che mi piace fare è aggiungere tutti i moduli a un profilo attivo di default perché pensavo che non ci fosse modo di rimuovere un modulo dall'esecuzione. In 3.2.1 lo hanno aggiunto come mostrato qui . Lascio questo commento nel caso in cui qualcuno inciampi qui e utilizzi i moduli per un motivo simile a me.
Captain Man

10

Questa domanda è antica, ma sembra che il problema sia risolvibile utilizzando activeProfileanziché activeByDefault. Sono su Maven 3.3.9, ma la soluzione potrebbe funzionare su versioni precedenti.

Elenca semplicemente il tuo activeProfilesnel tuo settings.xml, in questo modo:

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

In my-awesome-profileho impostazioni come URL del database e così via, quindi si applicano sempre . Qui, attivo un secondo profilo 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)

Notare come my-awesome-profileè ancora attivo. Sìì!


4

Puoi semplicemente elencare tutti i profili che desideri attivare sulla riga di comando in quanto tali:

-P profilo-1, profilo-2

maven è stato progettato per consentire l'attivazione automatica di più profili, se invece si sovrascrive quello con -P allora vengono attivati ​​solo i profili elencati nel parametro.


7
Non è del tutto vero. L'attivazione manuale dei profili con -Pdisattiva solo i <activeByDefault>profili. I profili attivati ​​da <activeProfiles>in settings.xmlo da qualsiasi altro tipo di <activation>restano attivi se non esplicitamente disattivati.
Sam Hanes

4

I profili sono un buon modo per portare un po 'di ordine in POM. Soprattutto se utilizzi più esecuzioni dello stesso plugin per scopi diversi.

Utilizzando i file:

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

Questo sarà sempre vero (a meno che qualcuno non elimini la directory durante l'avvio di Maven :). Testato con Maven 3.6.0.

Potrebbe anche essere un buon modo per differenziare i tipi di progetti. Ad esempio, il mio progetto è sempre module.jsonpresente.

Utilizzo di un profilo di attivazione dell'estensione

Esistono alcune estensioni Maven per l'attivazione del profilo. Uno di loro in un fork qui:
https://github.com/OndraZizka/el-profile-activator-extension


1
piccola correzione sembra essere<file><exists>.</exists></file>
revau.lt

-1

Non puoi mantenere attivo il profilo predefinito, ma puoi prendere il contenuto di quel profilo (il ... nel tuo esempio) e spostarlo semplicemente nella sezione principale del pom.

Solo perché stai usando i profili, non significa che tutto ciò che stai facendo debba essere all'interno di un profilo.


Questo non risponde alla domanda - OP afferma esplicitamente che il profilo dovrebbe essere "sempre attivo a meno che non sia esplicitamente disattivato". Presumibilmente a volte è necessario disabilitarlo esplicitamente, cosa che questa risposta non consente.
Sleske
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.