it-swarm.com.de

Maven WAR-Abhängigkeit

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, das WAR mit dem Maven-Dependency-Plugin zu entpacken, aber ich kann mein Projekt nicht dazu bringen, das entpackte WEB-INF/lib/*.jar und WEB-INF/classes/*, um in den Klassenpfad aufgenommen zu werden, damit 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.

79
deelo55

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 Projekt für Akzeptanztests verwenden können mit:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>
110

In der Tat löst Maven nicht die transitiven Abhängigkeiten eines Krieges auf, der als Abhängigkeit von einem Projekt deklariert wurde. Es gibt tatsächlich ein Problem damit, MNG-1991 , aber es wird in Maven 2.x und nicht gelöst Ich bin mir nicht sicher Ich weiß nicht, ob Overlays dieses Problem umgehen können. Ich verstehe die vorgeschlagene Lösung darin, die Abhängigkeiten zu duplizieren, beispielsweise in einem Projekt vom Typ pom.


(EDIT: Nach einigem mehr Graben fand ich etwas Interessantes in diesen Thread das ich unten zitiere:

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

Um mit War-Overlays maximale Leistung 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 Kriegsabhängigkeitsartefakten können von anderen Plugins verwendet werden, z. Kompilieren und ohren - so müssen Sie nicht mehr alle Abhängigkeiten berücksichtigen, wenn Sie Skinny Wars erstellen!

Das Plugin wurde in den letzten Monaten aktiv im AppFuse-Projekt verwendet und ist meines Erachtens an einem Punkt angelangt, 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 hosten.

Ich habe noch keine Erfahrung damit, aber das Maven Warpath Plugin sieht einfach und gut aus und ist im zentralen Repo verfügbar. Fügen Sie dazu das folgende Plugin-Konfigurationselement in Ihre pom.xml - Datei 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 Kriegsabhängigkeiten, die Sie in den Klassenpfad aufnehmen möchten, als Kriegspfadabhä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 die War- als auch die Warpath-Abhängigkeitstypen benötigt: Der War-Typ wird vom Maven-War-Plugin verwendet, um das War-Overlay zu erstellen. Der Warpath-Typ wird vom Warpath-Plugin verwendet, um die korrekte Liste der Artefakte für die Aufnahme in den Projektklassenpfad zu ermitteln.

Ich würde es versuchen.)

23
Pascal Thivent

Verwenden Sie Overlays . Zunächst muss Ihr Testprojekt auch war verpacken.

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>

dann konfiguriere 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 Webressourcen (wie Conxtext usw.).

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

13
cetnar

Guter Punkt, Justin. Das brachte mich dazu, mein Problem zu lösen, nämlich einen Krieg in eine Versammlung einzubeziehen UND all 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 von dieser groupId/artefactId verwiesen wird, aber

  • duplizieren der Kriegsabhängigkeit als Typ pom

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

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

in meine Assembly.xml-Datei.

Ich denke, das könnte auch ein Workaround für die ursprüngliche Frage dieses Threads sein.

4
Niels