Maven WAR-Abhängigkeit

81

Ich schreibe ein Projekt für Abnahmetests und aus verschiedenen Gründen hängt dies von einem anderen Projekt ab, das als WAR verpackt ist. Ich habe es geschafft, die WAR mit dem Maven-Dependency-Plugin zu entpacken, aber ich kann mein Projekt nicht dazu bringen, das Entpackte einzuschließen WEB-INF/lib/*.jarund WEB-INF/classes/*in den Klassenpfad aufzunehmen, sodass der Build fehlschlägt. Gibt es eine Möglichkeit, diese Dateien in den Klassenpfad aufzunehmen, oder gibt es eine bessere Möglichkeit, von einem WAR abhängig zu sein?

Danke vielmals.

deelo55
quelle

Antworten:

114

Es gibt eine weitere Option seit dem Maven-War-Plugin 2.1-Alpha-2. In Ihrem WAR-Projekt:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <attachClasses>true</attachClasses>
    </configuration>
</plugin>

Dadurch wird ein Klassenartefakt erstellt, das Sie im Abnahmetestprojekt verwenden können mit:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>
Christoph Leiter
quelle
6
Das einzige Problem dabei ist für mich, dass es keine transitiven Abhängigkeiten
zieht
1
Ja, danke für diesen Hinweis :) Es hat bei mir teilweise funktioniert. Mit der Maven-Kommandozeile ist alles in Ordnung. Mit Maven in Eclipse (m2e) ist es auch in Ordnung, Tests zu erstellen, die auf Klassen im Krieg verweisen, aber wenn ich versuche, die Tests (junit) auszuführen, muss ich die Auflösung des m2e-Arbeitsbereichs deaktivieren, damit dies funktioniert. Andernfalls löst der Junit-Lauf eine ClassNotFoundException für die referenzierten Klassen des Krieges aus. Irgendwie sind diese nicht im Junit-Ausführungsklassenpfad enthalten, obwohl das Kriegsprojekt in der Maven-Abhängigkeitsbibliothek im Erstellungspfad des Projekts aufgeführt ist. Irgendeine Idee?
Gandalf
1
Sie können den Pom der Abhängigkeit als Abhängigkeit des Projekts hinzufügen, um transitive Abhängigkeiten zu erhalten. So bekommen Sie eine Abhängigkeit von den Klassen und vom Pom
Jonatan Cloutier
Bitte beachten Sie, dass dieses Plugin in die <build> -Einstellungen des POM gehen sollte.
MichaelCleverly
24

Tatsächlich löst Maven keine transitiven Abhängigkeiten eines Krieges auf, der als Abhängigkeit eines Projekts deklariert wurde. Es gibt tatsächlich ein Problem, MNG-1991 , aber es wird in Maven 2.x nicht gelöst, und ich bin nicht sicher, ob ich nicht weiß, ob Overlays es ermöglichen, dieses Problem zu umgehen. Mein Verständnis der vorgeschlagenen Lösung besteht darin, die Abhängigkeiten zu duplizieren, beispielsweise in einem Projekt vom Typ pom.


(BEARBEITEN: Nach einigem Graben fand ich in diesem Thread etwas Interessantes , das ich unten zitiere:

Ich habe im letzten Monat bei der Entwicklung des AppFuse-Projekts mitgeholfen, bei dem wir die War-Overlay-Funktion im Maven War-Plugin intensiv nutzen. Es ist eine wirklich raffinierte Funktion!

Um maximale Leistung mit Kriegsüberlagerungen zu erzielen, habe ich das Warpath-Plugin entwickelt, mit dem Projekte Kriegsartefakte als vollwertige Abhängigkeiten verwenden können. In Kürze:

1) Der Inhalt des Verzeichnisses / WEB-INF / classes in den Kriegsabhängigkeitsartefakten kann im Klassenpfad des Projekts für normale Kompilierungsaufgaben usw. enthalten sein.
2) Transitive Abhängigkeiten von den Artefakten der Kriegsabhängigkeit werden für andere Plugins verfügbar, z. B. Kompilieren und Ohr - so müssen beim Erstellen von Skinny Wars nicht mehr alle Abhängigkeiten berücksichtigt werden!

Das Plugin wurde nun in den letzten Monaten aktiv im AppFuse-Projekt verwendet, und ich denke, es befindet sich an einem Punkt, an dem es sowohl verwendbar als auch stabil ist. Wäre das War Plugin Team daran interessiert, die Warpath-Funktionalität in das War Plugin aufzunehmen? Es scheint der natürlichste Ort zu sein, um es zu beherbergen.

Ich habe also keine Erfahrung damit, aber das Maven Warpath Plugin sieht tatsächlich gut und einfach aus und ist im zentralen Repo verfügbar. Um es zu verwenden, fügen Sie das folgende Plugin-Konfigurationselement in Ihre pom.xmlDatei ein:

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.appfuse</groupId>
      <artifactId>maven-warpath-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>add-classes</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

Fügen Sie die im Klassenpfad enthaltenen Kriegsabhängigkeiten als Kriegspfadtypabhängigkeiten hinzu :

[...]
<dependencies>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>war</type>
  </dependency>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>warpath</type>
  </dependency>
</dependencies>
[...]

Es werden sowohl der Kriegstyp als auch der Kriegspfad-Abhängigkeitstyp benötigt: Der Kriegstyp wird vom Maven-Kriegs-Plugin für die Kriegsüberlagerung verwendet, der Kriegspfad-Typ wird vom Kriegspfad-Plugin verwendet, um die richtige Liste von Artefakten für die Aufnahme in den Projektklassenpfad zu ermitteln.

Ich würde es versuchen.)

Pascal Thivent
quelle
1
Pascal, in meinem Projekt habe ich separate Module zum Ausführen von Integrationstests auf verschiedenen Servern (jedes Modul für einen Server). Diese Testmodule haben Testklassen und verwenden die Abhängigkeit von Krieg und Überlagerungen. Ich arbeite großartig.
Cetnar
Nun, wie ich schrieb, war ich mir nicht sicher, also danke für dieses Feedback, es ist gut zu wissen. Können Sie nur bestätigen, dass es mit den transitiven Abhängigkeiten eines Krieges funktioniert und nicht nur mit den Java-Klassen des Krieges?
Pascal Thivent
OK danke. Ich sehe, wie es jetzt funktioniert (der wichtige Teil ist Ihr 2. Satz: Ihr Testprojekt muss auch Verpackungskrieg haben ).
Pascal Thivent
1
Das Problem , das ich mit diesem Plugin ist , dass es nicht von m2eclipse unterstützt wird : maven.40175.n5.nabble.com/...
milan
Dieses Plugin unterbricht auch sowohl das Maven-Release- als auch das Assembly-Plugin, da beide versuchen, die Abhängigkeiten einer WAR aufzulösen, die das Warpath-Plugin verwendet. Maven bricht ab und sagt, dass die Abhängigkeit vom Typ = Warpath nicht aufgelöst werden kann. Schade, dass es nicht funktioniert.
HDave
14

Verwenden Sie Overlays . Erstens muss Ihr Testprojekt auch eine Verpackung habenwar .

Deklarieren Sie die Abhängigkeit des Kriegsprojekts, das Sie testen möchten:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>

Konfigurieren Sie dann das Maven-War-Plugin-Overlay:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webresources</directory>
                    <filtering>true</filtering>
                </resource>
            </webResources>
            <overlays>
                <overlay/>
                <overlay>
                    <groupId>your.group</groupId>
                    <artifactId>your-project-artifactId</artifactId>
                </overlay>
            </overlays>
        </configuration>
    </plugin>

Im obigen Beispiel im Testprojekt überschreibe ich Konfigurationsdateien für Webquellen (wie Kontext usw.).

EDIT: Diese Lösung wurde nicht mit Maven 3 getestet.

cetnar
quelle
1
Ich habe dies abgelehnt, bevor ich es getestet habe. Ich weiß nicht, ob dies daran liegt, dass ich Maven3 verwende, aber tatsächlich werden meine Ordner / classes und / lib durch mehrere WAR-Abhängigkeiten transitiv eingeschlossen. Nochmals - Entschuldigung für die Ablehnung. Anscheinend ist dies die "richtige" Antwort.
HDave
4

Guter Punkt, Justin. Das brachte mich dazu, mein Problem tatsächlich zu lösen, nämlich: einen Krieg in eine Versammlung aufzunehmen UND alle seine transitiven Abhängigkeiten einzubeziehen. Ich konnte die Kriegsabhängigkeit nicht als 'jar' duplizieren, wie Sie vorgeschlagen haben, da das Assembly-Plugin kein jar finden würde, auf das diese groupId / artefactId verweist, aber

  • Duplizieren der Kriegsabhängigkeit als Typ pom

funktioniert! Der Krieg und seine transitiven Abhängigkeiten sind nicht in der Versammlung enthalten. Um die (jetzt auch erscheinende) POM-Datei auszuschließen, musste ich ein Ausschlusselement wie das folgende hinzufügen:

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

in meine Assembly.xml-Datei.

Ich denke, dies könnte auch eine Problemumgehung für die ursprüngliche Frage dieses Threads sein.

Niels
quelle
-1

Wenn Sie die Abhängigkeit vom Kriegsprojekt als JAR-Abhängigkeit auflisten, scheint sie die erforderlichen Jars / Ressourcen aufzunehmen. Ich benutze Maven 2.2 + m2eclipse.

Justin
quelle