2014-07-04 15 views
5

Wenn ich laufen „mvn Abhängigkeit: Baum“ für mein Projekt es zeigt folgendes:Maven bringt „test“ transitive Abhängigkeit als „kompilieren“

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

Wie Sie sehen auf der markierten Linie, die XML-apis hat "compile" scope, und als Ergebnis wird es in WAR-Datei gepackt. Warum konnte es passieren?

Interessanterweise passiert es nur, während Java5 verwendet wird, für Java6 erscheint die Abhängigkeit als "Test".

Maven Version: 3.0.4

+0

Wird 'xml-api' nicht anderswo als eine andere Abhängigkeit angezeigt? –

+0

Testabhängigkeiten werden niemals in einen Krieg verpackt, außer du hast etwas Seltsames getan. Bitte zeigen Sie Ihre Pom-Datei. – khmarbaise

+0

@khmarbaise Ich weiß, aber aus irgendeinem Grund habe ich es! Die Pom-Datei ist ziemlich groß, es gibt mehrere Eltern Poms ... Ich habe nicht versucht, minimale Code-Probe zu extrahieren, ziemlich langweilig, aber absolut nichts besonderes über 'Selen-Htmlunit-Treiber-Abhängigkeit, wie üblich erklärt. – kan

Antwort

3

Wenn Sie einen Blick auf xercesImpl es eine Abhängigkeit xml-apis enthält: xml-apis: jar: 1.4.01: kompilieren mit dem Rahmen zusammenstellen, um die Anzeige der Abhängigkeit Plugin ist korrekt. Die Verwendung von -Dverbose führt die folgenden Schritte aus:

Ob ausgelassene Knoten in den serialisierten Abhängigkeitsbaum aufgenommen werden sollen.

Abgesehen von den oben genannten wird eine Testabhängigkeit wie in Ihrem Fall nie in eine WAR-Datei gepackt.

Es muss eine andere Quelle der gleichen Abhängigkeit sein, die die Verpackung in den Krieg verursacht

Das Weiteren die Änderung im Verhalten in Beziehung mit dem Hinzufügen von explizitem XML-APIs in Ihre pom ist ein zusätzlicher Beweis dafür.

+0

Ich glaube nicht, dass Sie meine Frage mit voller Aufmerksamkeit lesen. Wenn Sie sich irgendeine andere Testabhängigkeit anschauen, z. htmlunit, es hat alle seine Abhängigkeiten als compile, aber nur xml-apis wird als 'compile' angezeigt. Die '-Dverbose' sollte nur ausgelassene Knoten enthalten (ja, es passiert), aber in meinem Fall ändert sich auch der Umfang. Und das '.jar' ist in den Krieg verpackt. Irgendwelche Ideen, wie man die "andere Quelle" findet? Mein Wissen über Maven sagt mir, dass es keine anderen Quellen gibt. – kan

+0

Sie müssen an Ihrem Kriegsartefakt beginnen und über mvn dependency: tree sehen, wo alle Artefakte herkommen. – khmarbaise

+0

Das Fragment der Baumausgabe ist in meiner Frage. Die einzige Quelle, die ich sehe, ist der 'selen-htmlunit-Treiber'. Und wenn ich '' die 'xml-apis' aus dem Treiber, verschwindet die dep aus dem Baum. – kan

0

Ich hatte ein ähnliches Problem.

In meinem Fall einen Eintrag in der DependencyManagement eines Eltern Pom den Bereich des abhängigen Artefakts zu kompilieren. Eigentlich habe ich das Scope-Tag weggelassen, was im Grunde dasselbe ist wie das Einstellen des Scopes. Es zu ändern, half geholfen. Scheint, dass der Bereich in Abhängigkeitsverwaltung Vorrang vor dem transitiven Bereich hat. Das ist sinnvoll, kann aber immer noch Verwirrung stiften, wenn Sie nur die Version definieren möchten.

Es war eigentlich nicht schwer zu erkennen: Beim Blick auf den Effektiv-Pom zeigte sich der Eintrag dependencyManagement.

3

Untersuchen Sie die Ausgabe des folgenden Maven-Befehls.

mvn -X dependency:tree -Dverbose 

Das sollte Ihnen sagen, warum Maven den Bereich von Test zu kompilieren aktualisiert.

Verwandte Themen