Dependência de teste Maven em projeto de vários módulos

86

Eu uso o maven para construir um projeto de vários módulos. Meu módulo 2 depende do módulo 1 src no escopo de compilação e dos testes do módulo 1 no escopo do teste.

Módulo 2 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

Isso funciona bem. Digamos que meu módulo 3 dependa do src do Módulo1 e dos testes em tempo de compilação.

Módulo 3 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

Quando eu executo mvn clean install, meu build é executado até o módulo 3, falha no módulo 3 porque não conseguiu resolver a dependência de teste do módulo 1 Então eu faço um mvn installno módulo 3 sozinho, volto e corro mvn installno meu pai pom para construí-lo. Como posso consertar isso?

user209947
fonte
Você poderia compartilhar a aparência do seu pai pom?
Chris Gummer

Respostas:

127

Tenho uma dúvida sobre o que você está tentando fazer, mas assumirei que deseja reutilizar os testes que criou para um projeto (módulo1) em outro. Conforme explicado na nota na parte inferior do Guia para usar os testes anexados :

Observe que as edições anteriores deste guia sugeriram o uso em <classifier>tests</classifier>vez de <type>test-jar</type>. Embora isso funcione atualmente para alguns casos, não funciona corretamente durante uma construção do reator do módulo JAR de teste e qualquer consumidor se uma fase de ciclo de vida antes da instalação for chamada. Em tal cenário, o Maven não resolverá o JAR de teste da saída da construção do reator, mas do repositório local / remoto. Aparentemente, o JAR dos repositórios pode estar desatualizado ou completamente ausente, causando uma falha de construção (cf. MNG-2045 ).

Portanto, primeiro, para empacotar os testes compilados em um JAR e implantá-los para reutilização geral, configure o da maven-jar-pluginseguinte maneira:

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

Em seguida, instale / implante o artefato JAR de teste normalmente (usando mvn installou mvn deploy).

Finalmente, para usar o JAR de teste, você deve especificar uma dependência com um tipo especificado de test-jar:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>
Pascal Thivent
fonte
3
Pascal. Em primeiro lugar, muito obrigado por responder a todas as perguntas do maven !! Em relação a esta questão. Eu ainda tenho um problema. Eu tenho algumas classes testBase em um dos meus módulos principais que desejo usar em todos os objetos filho. Temos atualmente a compilação do maven em nosso CI. Se eu não quiser fazer nenhuma instalação de deploy para o test-jar e apenas verificar uma nova cópia do tronco e executar o teste mvn. Isso falha, já que eu não tenho o jar de teste em lugar nenhum ainda. Alguma ideia de como lidar com isso?
Romano
@Roman Executar a instalação é a maneira "natural". Mas parece que você encontrou uma solução alternativa.
Pascal Thivent
Parece ser esse problema 3559 não 2045 que está se segurando neste momento: jira.codehaus.org/browse/MNG-3559
HDave
Embora isso explique o que está acontecendo, não oferece uma solução alternativa. Ele apenas sugere fazer o que OP (e, por exemplo, I) já está fazendo.
Antoniossss
19

Com relação ao meu comentário sobre a pergunta de Pascals, acho que encontrei uma resposta adequada:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

A principal diferença aqui, como você pode ver aqui, é a <phase>tag.

Vou criar o test-jar e ele estará disponível na fase de compilação dos testes e não apenas após a fase de pacote.

Funciona para mim.

romano
fonte
1
Sim, muito conveniente. Obrigado por compartilhar. Acho que a abordagem de implantação é melhor apenas quando você tem um diretório corporativo (sim, eu sei que isso é altamente recomendado). Obrigado @Roman
Damien
2

Como https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html diz:

Como criar um jar contendo classes de teste Quando você deseja criar um jar contendo classes de teste, provavelmente deseja reutilizar essas classes. Existem duas maneiras de resolver isso:

  1. The easy way Crie um jar anexado com as classes de teste do projeto atual e perca suas dependências transitivas com escopo de teste.

  2. The preferred way Crie um projeto separado com as classes de teste.

Por favor, leia esse artigo para detalhes.

Pateta
fonte