Como manter os perfis Maven que são activeByDefault ativos mesmo se outro perfil for ativado?

113

Eu tenho um perfil no meu pom.xml que deve estar sempre ativo, a menos que seja explicitamente desativado (-P! FirstProfile). Resolvi isso usando o sinalizador activeByDefault:

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

Agora no mesmo pom.xml tenho um segundo perfil definido que só deve estar ativo se o perfil estiver realmente ativado (-P secondProfile). Portanto, o comportamento padrão é: firstProfile ativo, secondProfile inativo. Em algum outro momento, gostaria de ativar o segundo perfil, além do primeiro perfil. O problema é que, se eu fizer isso com "-P secondProfile", o firstProfile infelizmente será desativado. A documentação do Maven afirma o seguinte:

... Este perfil ficará automaticamente ativo para todas as compilações, a menos que outro perfil no mesmo POM seja ativado usando um dos métodos descritos anteriormente. Todos os perfis que estão ativos por padrão são automaticamente desativados quando um perfil no POM é ativado na linha de comando ou por meio de sua configuração de ativação. ...

Existe alguma possibilidade de como manter o firstProfile sempre ativo (sem ter que declará-lo no settings.xml)?

Peter
fonte

Respostas:

153

Um truque é evitar activeByDefaulte, em vez disso, ativar o perfil pela ausência de uma propriedade, por exemplo:

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

Você deve então ser capaz de desativar o perfil com -DskipFirstProfile ou com -P !firstProfile, mas, caso contrário, o perfil ficará ativo.

Veja: Maven: A Referência Completa, Ativação de Perfil - Ativação pela Ausência de uma Propriedade

Seanf
fonte
Em que circunstâncias isso é útil ou melhor do que mencionar explicitamente o próprio perfil? ou seja, em vez de passar -DmyFlag posso fazer -PmyDefaultProfile certo? Há alguma vantagem em controlá-lo com um sinalizador que estou faltando?
Chetya
1
Porque o perfil fica ativo automaticamente quando a bandeira não está lá. O perfil firstProfileé desativado apenas se você especificar -DskipFirstProfile(por exemplo mvn verify -DskipFirstProfile).
seanf
25

Eu gostaria que houvesse essa possibilidade, sempre a perdi. O único problema relevante do JIRA que consegui encontrar é este:

MNG-4917: Perfil não ativo, embora tenha activeByDefault definido como verdadeiro

E foi resolvido como Not A Problem.

Parei de usar activeByDefaultporque essa abordagem de "tudo ou nada" tornou-o inútil para mim.


A única maneira de mudar este comportamento é escrever seu próprio substituto para DefaultProfileSelector, registrá-lo como um componente do plexo @Component( role = ProfileSelector.class )e colocá-lo ${MAVEN_HOME}/lib/ext(assim ele será escolhido como seletor de perfil padrão). (Se você estiver usando o Maven 3.0.2 ou anterior, também terá que editar ${MAVEN_HOME}/bin/m2.confpara carregar lib/extantes de carregar lib)

Sean Patrick Floyd
fonte
Uma alternativa interessante seria a herança de perfis ou os decoradores de perfis, permitindo que as configurações básicas sejam reutilizadas.
Crowne
@crowne definitivamente, sim. Por que não sugerir isso como uma solicitação de recurso?
Sean Patrick Floyd
Isso está meio relacionado ... Uma coisa que eu gosto de fazer é adicionar todos os módulos a um perfil ativo por padrão porque pensei que não havia como remover um módulo da execução. No 3.2.1 eles adicionaram isso conforme mostrado aqui . Estou deixando este comentário no caso de alguém tropeçar aqui e estiver usando módulos por um motivo semelhante ao meu.
Capitão Homem
10

Esta questão é antiga, mas parece que o problema pode ser resolvido usando em activeProfilevez de activeByDefault. Estou no Maven 3.3.9, mas a solução pode funcionar em versões anteriores.

Simplesmente liste o seu activeProfilesem seu settings.xml, assim:

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

Em my-awesome-profileEu tenho configurações como URLs de banco de dados e assim por diante, então elas sempre se aplicam. Aqui, eu ativo um 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 como my-awesome-profileainda está ativo. Yay!

Inanutshellus
fonte
4

Você pode simplesmente listar todos os perfis que deseja ativar na linha de comando, como:

-P perfil-1, perfil-2

O maven foi projetado para permitir a ativação de vários perfis automaticamente; entretanto, se você substituir isso com o -P, apenas os perfis listados no parâmetro serão ativados.

Assem
fonte
7
Isso não é totalmente verdade. A ativação manual de perfis -Papenas desativa <activeByDefault>perfis. Os perfis ativados por <activeProfiles>em settings.xmlou por qualquer outro tipo de <activation>permanecem ativos, a menos que sejam explicitamente desativados.
Sam Hanes,
4

Os perfis são uma boa maneira de colocar alguma ordem no POM. Especialmente se você usar várias execuções do mesmo plugin para finalidades diferentes.

Usando arquivos:

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

Isso sempre será verdade (a menos que alguém exclua o diretório durante a inicialização do Maven :). Testado com Maven 3.6.0.

Também pode ser uma boa maneira de diferenciar os tipos de projetos. Por exemplo, meu projeto sempre module.jsonesteve presente.

Usando uma extensão de ativação de perfil

Existem algumas extensões Maven para ativação de perfil. Um deles em uma bifurcação aqui:
https://github.com/OndraZizka/el-profile-activator-extension

Ondra Žižka
fonte
1
parece ser uma pequena correção<file><exists>.</exists></file>
revau.lt 01 de
-1

Você não pode manter o perfil padrão ativo, mas pode pegar o conteúdo desse perfil (o ... no seu exemplo) e simplesmente movê-lo para a seção principal do pom.

Só porque você está usando perfis, isso não significa que tudo o que você está fazendo precisa estar dentro de um perfil.

Daniel Stolz
fonte
Isso não responde à pergunta - o OP afirma explicitamente que o perfil deve estar "sempre ativo, a menos que seja explicitamente desativado". Presumivelmente, às vezes é necessário desativá-lo explicitamente, o que essa resposta não permite.
sleske