Ignorar um submódulo durante uma compilação do Maven

160

Precisamos ser capazes de pular um submódulo em determinados ambientes.

O módulo em questão contém testes de integração e leva meia hora para ser executado. Portanto, queremos incluí-lo na criação no servidor de IC, mas quando os desenvolvedores criam localmente (e os testes são executados), queremos pular esse módulo.

Existe uma maneira de fazer isso com uma configuração de perfil? Eu pesquisei no Google e olhei para as outras perguntas / respostas aqui e não encontrei uma boa solução.

Suponho que uma opção é remover completamente esse submódulo do pai pom.xmle adicionar outro projeto em nosso servidor de IC para criar esse módulo.

Sugestões?

denishaskin
fonte
Por que não Maven Way? É uma reivindicação perfeitamente válida para mim.
MADA
Hmm. Agora não consigo encontrar os lugares onde as pessoas pareciam estar argumentando contra isso ... então atualizei minha pergunta original para remover minha alegação de que esse não parece ser "o caminho do Maven".
Denishaskin 02/12

Respostas:

149

Claro, isso pode ser feito usando perfis. Você pode fazer algo como o seguinte no pom.xml pai.

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

No seu IC, você executaria o maven com o ciperfil, ou seja,mvn -P ci clean install

Raghuram
fonte
4
Excelente resposta! Não sei por que tive tantos problemas para descobrir isso nos documentos do Maven. A única sugestão que eu faria é que, porque prefiro que os testes de integração sejam executados por padrão, eu adicionei activeByDefaulta esse perfil e tive que adicionar outro perfil vazio (por exemplo skip-integration-tests) para poder ignorá-los.
Denishaskin #
7
existe alguma maneira de fazer isso sem duplicar todas as coisas compartilhadas?
JonnyRaa
7
Cuidado, se você usar o maven-release-plugin, parece que ele não atualiza o número da versão dos submódulos ocultos atrás de uma opção de perfil. Você poderia ter sub-módulos com diferentes números de versão para o resto do seu projeto ...
Ardesco
8
Infelizmente, ao usar o perfil, você não pode excluir um módulo mencionado anteriormente na parte principal <modules> do pom. O JIRA issues.apache.org/jira/browse/MNG-5230 (e toda a estrutura pom) poderia ter sido totalmente implementado muito melhor com um pouco mais de cuidado.
Ed Randall
2
Esta solução realmente funciona? Pelo menos eu não consigo fazê-lo funcionar. Parece que eu tenho o mesmo problema como @EdRandall
Gerros
231

A versão 3.2.1 do Maven adicionou esse recurso. Você pode usar a -plopção ( atalho para --projectslista) com !ou -( fonte ) para excluir determinados sub-módulos.

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

Tenha cuidado em bater o personagem! é um caractere especial, então você precisa aspá-lo (como eu fiz) ou escapar com o caractere de barra invertida.

A sintaxe para excluir vários módulos é igual à inclusão

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

EDIT O Windows não parece gostar de aspas simples, mas é necessário no bash; no Windows, use aspas duplas (obrigado @awilkinson)

mvn -pl "!submodule1,!submodule2" install
Alexandre DuBreuil
fonte
27
Importante: se você deseja excluir um submódulo aninhado, precisa usar a versão qualificada mvn -pl !com.acme:nestedmodule1
Leonard Brünings
3
A opção -pl precisa de '[groupId]:' before artifactId, portanto devemos usar mvn -pl '!: Submodule-to-exclude' install
Honsen
4
Você também pode usar mvn -pl '!path/to/submodule/directory', sem usar groupId e artifactId. Minha resposta funciona se submodule1e submodule2estiver localizada no diretório atual.
Alexandre DuBreuil 15/03/19
Também vale a pena nada que se você usar -plem mvn install, você provavelmente vai precisar usá-lo para mvn deploybem
majikman
39

É possível decidir quais projetos de reatores serão construídos especificando o -plargumento da linha de comando:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

Ele aceita uma lista de parâmetros separados por vírgula em uma das seguintes formas:

  • caminho relativo da pasta que contém o POM
  • [groupId]:artifactId

Assim, dada a seguinte estrutura:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

Você pode especificar a seguinte linha de comando:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

para construir tudo. Remova os elementos da lista para criar apenas os módulos que desejar.


EDIT: como blackbuild apontou, a partir do Maven 3.2.1 você tem uma nova -elbandeira que exclui projetos do reator, da mesma forma que -pl:

skuro
fonte
2
Obrigado. Isto funcionou bem para mim. Observe também que você pode adicionar o "-am" (AKA "--also-make") para também criar projetos que são requeridos pelos módulos que você especificou.
GaZ 20/02
1
Ótimo! Usei mvn install -pl .para instalar o pom pai apenas no repositório local sem construir módulos.
Marcin
Além disso, dê uma olhada em jira.codehaus.org/browse/MNG-5230 . Agora você pode excluir projetos do reator.
blackbuild
1
MNG-5230 elo desde codehaus.org fechado: issues.apache.org/jira/browse/MNG-5230
Ed Randall
Infelizmente, ele não funciona de forma transitória, ou seja, se eu tiver top / mod1 / mod2 e construir a partir de cima, -pl '! Mod2' gera um erro.
Zakmck
4

A noção de projetos com vários módulos existe para atender às necessidades de segmentos co-dependentes de um projeto. Esse cliente depende dos serviços que, por sua vez, dependem dos EJBs ou das rotinas de acesso a dados. Você pode agrupar seus testes de integração contínua (IC) dessa maneira. Eu racionalizaria isso dizendo que os testes de IC precisam estar em sintonia com as alterações na lógica do aplicativo.

Suponha que seu projeto esteja estruturado como:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

Os project-root/pom.xmlmódulos define

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

O ci/pom.xmldefine perfis como:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

Isso fará com que o Maven pule os testes neste módulo, exceto quando o perfil nomeado CIestiver ativo. Seu servidor de IC deve ser instruído para executar mvn clean package -P CI. O site do Maven tem uma explicação detalhada do mecanismo de criação de perfil .

Sri Sankaran
fonte
2

agora existe (da versão 1.1.1) um sinalizador 'pular' no poço.

Então você pode fazer coisas como:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

no seu módulo, e o pit pulará

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @ module-selenium --- [INFO] Ignorando o projeto

twillouer
fonte