Maven test zależności w projekcie wielomodułowym

86

Używam mavena do tworzenia projektów wielomodułowych. Mój moduł 2 zależy od źródła modułu 1 w zakresie kompilacji i testów modułu 1 w zakresie testowym.

Moduł 2 -

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

To działa dobrze. Powiedz, że mój moduł 3 zależy od źródła Module1 i testów w czasie kompilacji.

Moduł 3 -

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

Kiedy uruchamiam mvn clean install, moja kompilacja działa do modułu 3, kończy się niepowodzeniem w module 3, ponieważ nie może rozwiązać zależności testowej modułu 1. Następnie robię mvn installsam moduł 3, wracam i uruchamiam mvn installmój macierzysty pom, aby go zbudować. Jak mogę to naprawić?

user209947
źródło
Czy mógłbyś podzielić się tym, jak wygląda Twój pompon?
Chris Gummer,

Odpowiedzi:

127

Mam wątpliwości co do tego, co próbujesz zrobić, ale zakładam, że chcesz ponownie użyć testów, które utworzyłeś dla projektu (moduł1) w innym. Jak wyjaśniono w uwadze na dole Przewodnika na temat korzystania z załączonych testów :

Zwróć uwagę, że poprzednie wydania tego przewodnika sugerowały użycie <classifier>tests</classifier>zamiast <type>test-jar</type>. Chociaż obecnie działa to w niektórych przypadkach, nie działa poprawnie podczas budowania reaktora testowego modułu JAR i jakiegokolwiek konsumenta, jeśli wywoływana jest faza cyklu życia przed instalacją. W takim scenariuszu Maven nie rozwiąże testowego pliku JAR na podstawie danych wyjściowych kompilacji reaktora, ale z lokalnego / zdalnego repozytorium. Najwyraźniej JAR z repozytoriów mógł być nieaktualny lub całkowicie go brakować, powodując awarię kompilacji (por. MNG-2045 ).

Aby więc najpierw spakować skompilowane testy w pliku JAR i wdrożyć je w celu ogólnego ponownego wykorzystania, skonfiguruj maven-jar-pluginnastępujące elementy:

<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>

Następnie zainstaluj / wdróż testowy artefakt JAR w zwykły sposób (za pomocą mvn installlub mvn deploy).

Na koniec, aby użyć testowego pliku JAR, należy określić zależność z określonym typem 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
źródło
3
Pascal. Przede wszystkim wielkie dzięki za odpowiedzi na wszystkie pytania! Odnośnie tego pytania. Nadal mam problem. Mam klasę testBase w jednym z moich podstawowych modułów, której chcę użyć we wszystkich obiektach podrzędnych. Obecnie mamy maven wbudowane w naszym CI. Jeśli nie chcę wykonywać żadnej instalacji wdrożenia do pliku test-jar i po prostu sprawdzić nową kopię z trunk i uruchomić test mvn. To się nie udaje, ponieważ nie mam jeszcze nigdzie słoika testowego. Masz jakiś pomysł, jak sobie z tym poradzić?
Roman
Instalacja @Roman Running jest „naturalną” metodą. Ale wygląda na to, że znalazłeś obejście.
Pascal Thivent
Wydaje się, że to ten problem 3559, a nie 2045 jest wstrzymany w tym momencie: jira.codehaus.org/browse/MNG-3559
HDave
Chociaż to wyjaśnia, co się dzieje, nie zapewnia obejścia. Po prostu sugeruje zrobienie tego, co już robi OP (i np. Ja).
Antoniossss
19

Jeśli chodzi o mój komentarz do pytania Pascalsa, myślę, że znalazłem stabilną odpowiedź:

<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>

Główną różnicą, jak widać tutaj, jest <phase>tag.

Stworzę test-jar i będzie on dostępny w fazie kompilacji testów, a nie tylko po fazie pakowania.

Pracuje dla mnie.

rzymski
źródło
1
Tak, bardzo wygodne. Dzięki za udostępnienie. Wydaje mi się, że podejście do wdrażania jest lepsze tylko wtedy, gdy masz katalog firmowy (tak, wiem, że jest to zdecydowanie zalecane). Dzięki @Roman
Damien
2

Jak mówi https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html :

Jak stworzyć jar zawierający klasy testowe Gdy chcesz stworzyć jar zawierający klasy testowe, prawdopodobnie będziesz chciał ponownie użyć tych klas. Istnieją dwa sposoby rozwiązania tego problemu:

  1. The easy way Utwórz dołączony jar z klasami testowymi z bieżącego projektu i utracić jego przechodnie zależności o zakresie testowym.

  2. The preferred way Utwórz osobny projekt z klasami testowymi.

Przeczytaj ten artykuł, aby uzyskać szczegółowe informacje.

Głupkowaty
źródło