2014-07-04 15 views
5

Kiedy uruchamiam „mvn zależność: drzewa” dla mojego projektu to pokazuje następujące:Maven przynosi „test” przechodni zależność jako „kompilacji”

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ xxxxx --- 
[INFO] com.xxx.xxx:xxxxx:war:3.1.0-SNAPSHOT 
... 
[INFO] +- commons-configuration:commons-configuration:jar:1.5:compile 
[INFO] | \- commons-beanutils:commons-beanutils-core:jar:1.7.0:compile 
[INFO] +- org.seleniumhq.selenium:selenium-api:jar:2.34.0:test 
[INFO] | +- com.google.guava:guava:jar:14.0:test 
[INFO] | \- org.json:json:jar:20080701:test 
[INFO] +- org.seleniumhq.selenium:selenium-htmlunit-driver:jar:2.34.0:test 
[INFO] | +- org.seleniumhq.selenium:selenium-remote-driver:jar:2.34.0:test 
[INFO] | | +- cglib:cglib-nodep:jar:2.1_3:test 
[INFO] | | +- net.java.dev.jna:jna:jar:3.4.0:test 
[INFO] | | \- net.java.dev.jna:platform:jar:3.4.0:test 
[INFO] | \- net.sourceforge.htmlunit:htmlunit:jar:2.12:test 
[INFO] |  +- org.apache.commons:commons-lang3:jar:3.1:test 
[INFO] |  +- org.apache.httpcomponents:httpmime:jar:4.2.3:test 
[INFO] |  +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.12:test 
[INFO] |  +- xerces:xercesImpl:jar:2.10.0:test 
>>>[INFO] |  | \- xml-apis:xml-apis:jar:1.4.01:compile 
[INFO] |  +- net.sourceforge.nekohtml:nekohtml:jar:1.9.18:test 
[INFO] |  +- net.sourceforge.cssparser:cssparser:jar:0.9.9:test 
[INFO] |  | \- org.w3c.css:sac:jar:1.3:test 
[INFO] |  \- org.eclipse.jetty:jetty-websocket:jar:8.1.9.v20130131:test 
[INFO] +- org.seleniumhq.selenium:selenium-firefox-driver:jar:2.34.0:test 
... 

jak widać na zaznaczonej linii, XML API ma zasięg "kompilacji", w wyniku czego jest spakowany do pliku .war. Dlaczego to się stało?

Co ciekawsze, dzieje się tak tylko wtedy, gdy używana jest Java5, dla Javy 6 zależność pojawia się jako "test".

Maven wersja: 3.0.4

+0

Czy 'xml-api' nie pojawia się gdzie indziej jako inna zależność? –

+0

Zależności testowe nigdy nie zostaną zapakowane w wojnę, chyba że zrobiłeś coś dziwnego. Proszę pokazać swój plik pom. – khmarbaise

+0

@khmarbaise Wiem, ale z jakiegoś powodu mam go! Plik pom jest dość duży, istnieje kilka pom-poms ... Nie próbowałem wyodrębnić minimalnej próbki kodu, dość żmudnej, ale absolutnie nic specjalnego w zależności '' selenium-htmlunit-driver', zadeklarowanej jak zwykle. – kan

Odpowiedz

3

Jeśli spojrzeć na xercesImpl zawiera on zależność do XML API XML-API: jar: 01.04.01: skompilować z zakresu kompilacji więc wyświetlanie uzależnienia wtyczka jest poprawna. Użycie numeru -Dverbose spowoduje wykonanie czynności opisanych w dokumentach:

Czy dołączyć pominięte węzły do ​​drzewa zależności w postaci szeregowej.

Niezależnie od powyższego, zależność od testu, jak w twoim przypadku, nigdy nie jest pakowana do pliku wojennego.

Musi istnieć inne źródła z tego samego uzależnienia, które powoduje, że opakowanie do wojny

Ponadto zmiana zachowań w relacjach z dodawania jawnych XML API do pom jest dodatkowe dowody na to.

+0

Nie sądzę, że czytasz moje pytanie z pełną uwagą. Jeśli spojrzysz na jakąkolwiek inną zależność od testu, np. htmlunit, wszystkie jego zależności są kompilowane, ale tylko xml-apis jest wyświetlany jako "kompilacja". Polecenie '-Dverbose' powinno zawierać pominięte węzły (tak, to się dzieje), ale w moim przypadku także zmienia zakres. A ".jar" jest zapakowany w wojnę. Jakieś pomysły, jak znaleźć "inne źródło"? Moja wiedza na temat Mavena mówi mi, że nie ma innych źródeł. – kan

+0

Musisz zacząć od artefaktu wojennego i zobaczyć zależność mvn: drzewo, z którego pochodzą wszystkie artefakty. – khmarbaise

+0

Fragment drzewa wyjściowego jest w moim pytaniu. Jedyne źródło, jakie widzę, to 'selenium-htmlunit-driver'. A jeśli '' '' xml-apis' od sterownika, dep zniknie z drzewa. – kan

0

Miałem podobny problem.

W moim przypadku wpis w dependencyZarządzanie rodzimym pom ustawia zakres zależnego artefaktu do kompilacji. Właściwie to pominąłem tag scope, który faktycznie jest taki sam jak ustawienie do kompilacji. Zmiana pomogła. Wydaje się, że zasięg w zależnościManagement ma pierwszeństwo przed zasięgiem przechodniowym. To ma sens, ale nadal może powodować zamieszanie, gdy wszystko, co chcesz zrobić, to zdefiniować wersję.

To nie było trudne do zauważenia: Patrząc na skuteczne pom pokazało wpisu dependencyManagement.

3

Przestudiuj wynik działania następującego polecenia Mavena.

mvn -X dependency:tree -Dverbose 

To powinno ci powiedzieć, dlaczego Maven zaktualizował zakres z testu do kompilacji.

Powiązane problemy