web-dev-qa-db-de.com

Richtige Möglichkeit, mehrere Bereiche für die Maven-Abhängigkeit zu deklarieren?

Ich habe eine Abhängigkeit, die ich im Bereich test verwenden möchte (damit sie sich im Klassenpfad befindet, wenn ich Komponententests durchführe), und im Bereich runtime (damit ich sie in enthalten kann) WAR/EAR/andere Pakete für die Bereitstellung, die sich jedoch nicht auf die Suche nach transitiven Abhängigkeiten für abhängige Artefakte auswirken.

Ein reales Beispiel sind die Implementierungs-JARs von SLF4J (z. B. Logback). Ich möchte, dass es im Klassenpfad vorhanden ist, wenn ich Tests durchführe, und ich möchte, dass es in mein WAR/EAR aufgenommen wird, aber ich möchte nicht, dass das Projekt in Abhängigkeit von meinem Projekt das in die transitive Abhängigkeitssuche einbezieht.

Ich habe versucht, <scope>test,runtime</scope> aber Maven 3 gibt eine Warnung aus:

[WARNING] 'dependencies.dependency.scope' for org.slf4j:jcl-over-slf4j:jar 
must be one of [provided, compile, runtime, test, system] but is 'test,runtime'. 

Was ist in einem solchen Fall der richtige Weg, um den Abhängigkeitsumfang zu deklarieren?

53
Adrian Shum

Der Laufzeitbereich stellt das Artefakt auch im Testklassenpfad zur Verfügung. Verwenden Sie einfach die Laufzeit. (Siehe den Maven Dokumentation .)

Um zu vermeiden, dass die Abhängigkeit transitiv aufgelöst wird, machen Sie es auch optional mit <optional>true</optional>:

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback</artifactId>
  <version>0.5</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>
35
Christopher

Sie können nur einen Bereichswert pro <scope/> - Tag definieren.

Ich fürchte, was Sie tun möchten, kann nicht durch bloße Verwendung eines Oszilloskops erreicht werden. Wenn Sie einen Bereich von test definieren, ist dieser nur während der Tests verfügbar. Wenn Sie einen Bereich von "Bereitgestellt" definieren, würde dies bedeuten, dass die Abhängigkeit für Ihr Projekt aufgelöst und sowohl beim Kompilieren als auch beim Testen verwendet wird. Sie wird jedoch nicht in Ihre WAR-Datei aufgenommen. So oder so ist es nicht das, was Sie wollen würden.

Daher würde ich empfehlen, dass Sie sich das maven-Assembly-plugin ansehen, mit dem Sie es erreichen können, aber es wird immer noch einige Spielereien erfordern.

12
carlspring

Das Deklarieren einer Abhängigkeit mit einem Bereich von runtime stellt sicher, dass die Bibliothek während der Kompilierungszeit nicht verfügbar ist.

Das Deklarieren der Abhängigkeit als optional führt zu einer Unterbrechung des Abhängigkeitsauflösungsprozesses. Projekte, die von Ihren Bibliotheken abhängen, müssen die Abhängigkeiten selbst explizit einbeziehen.

Der richtige Weg, dies zu deklarieren, wäre also:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.13</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>
7
Chris Tickner