2011-01-24 12 views
13

Mam problemy z używaniem zależności test-jar w projekcie wielomodułowym. Na przykład, kiedy deklaruje, że moduł cleartk-syntax zależy moduł cleartk-token na test-jar tak (pełny kod jest here):Dlaczego wymagana jest zależność "test-jar" dla "mvn compile"

<modelVersion>4.0.0</modelVersion> 
<groupId>org.cleartk</groupId> 
<artifactId>cleartk-syntax</artifactId> 
<version>0.5.0-SNAPSHOT</version> 
<name>cleartk-syntax</name> 
... 
<dependencies> 
    ... 
    <dependency> 
     <groupId>org.cleartk</groupId> 
     <artifactId>cleartk-token</artifactId> 
     <version>0.7.0-SNAPSHOT</version> 
     <type>test-jar</type> 
     <scope>test</scope> 
    </dependency> 

pojawia się następujący błąd, jeśli biegnę mvn compile użyciu Maven 2:

[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Failed to resolve artifact. 

Missing: 
---------- 
1) org.cleartk:cleartk-token:test-jar:tests:0.7.0-SNAPSHOT 

Jeśli używam maven 3 pojawia się błąd:

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 4.654s 
[INFO] Finished at: Mon Jan 24 21:19:17 CET 2011 
[INFO] Final Memory: 16M/81M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal on project cleartk-syntax: Could not resolve 
dependencies for project org.cleartk:cleartk-syntax:jar:0.5.0-SNAPSHOT: Could 
not find artifact org.cleartk:cleartk-token:jar:tests:0.7.0-SNAPSHOT 

w tym ostatnim przypadku, jestem par szczególnie zdezorientowany, ponieważ pomyślałbym, że powinien szukać artefaktu typu test-jar nie typu jar.

Z maven 2 lub maven 3, mogę go skompilować, uruchamiając mvn compile package -DskipTests. Z maven 3, mogę również go skompilować, uruchamiając mvn compile test-compile.

Ale dlaczego maven 2 lub maven 3 szuka zależności test-jar podczas fazy compile? Czy nie powinno się czekać aż faza test-compile będzie szukać takich zależności?

Aktualizacja: Odpowiedź brzmiała, że ​​wtyczka maven-exec, używana podczas mojej fazy kompilacji, requires dependency resolution of artifacts in scope:test. Stworzyłem a feature request to remove the scope:test dependency.

Odpowiedz

8

To wygląda na konkretny błąd dla mnie.

Mam ten sam problem i testowałem Maven 3.0.1 i 3.0.2. Sprawdzanie poprawności nie kończy się niepowodzeniem, tylko krok kompilacji kończy się niepowodzeniem. Z Maven 3 mvn compile zrywa, ale działa mvn test-compile.

Wygląda na to, że faza kompilacji szuka artefaktów pojemnika testowego w reaktorze, a następnie repo, ale nie powinna, ponieważ zależność znajduje się w zakresie testowym. Artefakty zasięgu testowego powinny zostać rozwiązane podczas kompilacji testowej, a nie kompilacji.

W rezultacie pomyślałem, że można to obejść, odwzorowując cel testCompile wtyczki maven-kompilatora na fazę kompilacji zamiast domyślnej fazy kompilacji testowej.

Dodałem to do mojego pom, tuż obok tej części, która dodaje tworzenie test-jar w górnej pom:

<!-- there is a bug in maven causing it to resolve test-jar types 
     at compile time rather than test-compile. Move the compilation 
     of the test classes earlier in the build cycle --> 
    <plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>default-testCompile</id> 
     <phase>compile</phase> 
     <goals> 
      <goal>testCompile</goal> 
     </goals> 
     </execution> 
    </execution> 
    </plugin> 

Ale to nie będzie działać, ponieważ albo pięciu faz między kompilacji i badania -Kompiluj nie uruchamiaj i nie konfiguruj rzeczy jak testowa ścieżka klas.

Domyślam się, że prawdziwym obejściem, dopóki ten błąd nie zostanie naprawiony, jest użycie test-compile zamiast compile.

+0

Potwierdziłem, że pierwszą fazę maven do pracy jest test-kompilacja. process-test-resources nie działa. –

+0

Miło słyszeć, że nie jestem sam, wpadając na ten błąd. W twoim przypadku używasz również wtyczki 'exec: java' - która wydawała mi się częścią problemu. Jeśli nie, czy wiążesz inne wtyczki do faz wykonania? – Steve

+0

Co niedawno odkryłem, ale jeszcze nie rozwinęłam, to mogę spowodować problem dzięki bardzo zredukowanemu zestawowi 3 plików pom. Jeśli te trzy (mój projekt) dziedziczą z niczego, to działa. Jeśli odziedziczą po org.apache: apache, to się zepsuje. Tak więc jedna z wtyczek zdefiniowanych tam prawdopodobnie ją zrywa. Nie ma tam exec: plug-in java - ale jedna z tych wtyczek i exec prawdopodobnie zależy od czegoś innego zepsutego. Skomentuję tutaj, jeśli mogę go zawęzić. –

0

Używam maven2. Myślę, że odpowiedź jest w zarządzaniu cyklem życia maven. Pierwszym krokiem domyślnego cyklu życia jest walidacja, która "sprawdza poprawność projektu jest poprawna i wszystkie niezbędne informacje są dostępne." (patrz http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html).

Więc maven próbuje wszystkiego, aby uzyskać wszystkie potrzebne zależności do późniejszej realizacji.

+0

Ale jeśli tak jest, to dlaczego działa "pakiet kompilacji mvn"? – Steve

+0

Wspominałeś, że działa tylko wtedy, gdy podasz parametr -DskipTests = true. Czy może to być coś z wewnętrznej optymalizacji maven? – WeMakeSoftware

+0

Działa bez -DskipTests również. Właśnie dodałem, że ponieważ próbuję tylko kompilować, a nie testować. – Steve

1

Zrobiłem poważne debugowanie i odkryłem, że problem wydaje się być interakcją między opcjami exec:java, test-jar zależnościami i mvn compile.

Krótko mówiąc, jeśli dołączymy exec:java do fazy wykonania, mvn compile rozpocznie wyszukiwanie zależności test-jar w czasie kompilacji. Jeśli usuniesz element <executions> z deklaracji wtyczki exec:java, mvn compile znów działa poprawnie.

I złożył raport o błędzie do wtyczki exec:java tutaj, choć nie mogę powiedzieć, czy błąd jest w exec:java, test-jar lub mvn compile więc chyba bug zostanie przeniesiony gdzieś indziej jeśli/kiedy ktoś dane, które się:

http://jira.codehaus.org/browse/MEXEC-91

Aktualizacja: To naprawdę nie jest to błąd, the-plugin Maven-Exec jest udokumentowana jako wymagających zależności testowych tutaj:

http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html

To nie znaczy, że nie byłaby świetną opcją. ;-)

7

W moim przypadku przyczyną było to, że moduł, który powinien być używany jako zależność w test z zakresu typu test-jar nie zawiera wymaganej konfiguracji maven-jar-plugin. Bez poniższego opisu żaden słoik testowy nie zostanie wdrożony po wywołaniu mvn deploy w odpowiednim module.

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

Zobacz https://maven.apache.org/guides/mini/guide-attached-tests.html więcej szczegółów.

+0

To była też moja główna przyczyna . – riverhorse

Powiązane problemy