79 votes

Dépendance Maven WAR

Je suis en train d'écrire un projet pour les tests d'acceptation et, pour diverses raisons, il dépend d'un autre projet qui est empaqueté sous forme de WAR. J'ai réussi à décompresser le WAR à l'aide du plugin maven-dependency, mais je n'arrive pas à inclure dans mon projet le WAR décompressé. WEB-INF/lib/*.jar et WEB-INF/classes/* à inclure dans le classpath pour que la construction échoue. Y a-t-il un moyen d'inclure ces fichiers dans le classpath, ou existe-t-il un meilleur moyen de dépendre d'un WAR ?

Merci beaucoup.

110voto

Christoph Leiter Points 4350

Il existe une autre option depuis maven-war-plugin 2.1-alpha-2. Dans votre projet WAR :

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

Cela crée un artefact de classes que vous pouvez utiliser dans le projet de tests d'acceptation avec :

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

23voto

Pascal Thivent Points 295221

En effet, par conception, Maven ne résout pas les dépendances transitives d'une guerre déclarée comme dépendance d'un projet. Il y a en fait un problème à ce sujet, MNG-1991 mais ce problème ne sera pas résolu dans Maven 2.x et Je ne suis pas sûr que Je ne sais pas si les superpositions permettent de contourner ce problème. Si je comprends bien, la solution proposée consiste à dupliquer les dépendances, par exemple dans un projet de type pom.


(EDIT : Après avoir creusé un peu plus, j'ai trouvé quelque chose d'intéressant dans ce fil que je cite ci-dessous :

J'ai aidé au développement du projet AppFuse le mois dernier. le mois dernier, où nous utilisons beaucoup la fonctionnalité de superposition de guerre dans le Maven war plugin. Il s'agit d'une fonctionnalité très pratique !

Pour obtenir une puissance maximale avec les superpositions de guerre, j'ai développé le plugin Warpath qui permet aux projets d'utiliser les artefacts de guerre comme des dépendances à part entière. En bref :

1) Le contenu du répertoire /WEB-INF/classes dans la dépendance de la guerre. peut être inclus dans le classpath du projet pour les tâches normales de compilation, etc.
2) Les dépendances transitives des artefacts de dépendance de la guerre deviennent disponibles pour être utilisées par d'autres plugins, par exemple compile et ear. plus besoin d'inclure toutes les dépendances lors de la création de skinny wars !

Le plugin est maintenant activement utilisé dans le projet AppFuse depuis les quelques mois, et je pense qu'il est à un point où il est à la fois utilisable et stable. stable. L'équipe chargée du plugin war serait-elle intéressée par l'inclusion du plugin warpath dans le plugin war ? Il semblerait que ce soit l'endroit le plus naturel pour l'héberger.

Donc, je n'ai pas d'expérience avec ça, mais la plugin maven warpath a l'air simple et agréable et est disponible dans le dépôt central. Pour l'utiliser, incluez l'élément de configuration suivant du plugin dans votre fichier pom.xml fichier :

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

Et ajoutez les dépendances de la guerre que vous voulez inclure dans le classpath en tant que warpath dépendances de type :

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

Les types de dépendance war et warpath sont tous deux nécessaires : le type war est utilisé par le plugin Maven war pour effectuer la superposition des war, le type warpath est utilisé par le plugin Warpath pour déterminer la liste correcte des artefacts à inclure dans le classpath du projet.

Je ferais un essai.)

14voto

cetnar Points 6170

Utilisez superpositions . Tout d'abord, votre projet de test doit également avoir un packaging. war .

Déclarez la dépendance du projet de guerre que vous voulez tester :

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

puis configurer la superposition de maven-war-plugin :

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

Dans l'exemple ci-dessus, dans le projet de test, j'écrase les fichiers de configuration des ressources web (comme conxtext, etc.).

EDIT : Cette solution n'a pas été testée avec Maven 3.

4voto

Niels Points 21

Bon point, Justin. Cela m'a permis de résoudre mon problème, à savoir : inclure une guerre dans un assemblage ET inclure toutes ses dépendances transitives. Je ne pouvais pas dupliquer la dépendance de la guerre en tant que 'jar' comme vous l'avez suggéré puisque le plugin d'assemblage ne trouverait pas de jar référencé par ce groupId/artefactId, mais

  • duplication de la dépendance de la guerre en tant que type pom pom

fonctionne ! La guerre et ses dépendances transitives ne sont pas incluses dans l'assemblage. Pour exclure le fichier pom (qui apparaît maintenant aussi), j'ai dû ajouter un élément d'exclusion comme ceci :

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

dans mon fichier assembly.xml.

Je pense que cela pourrait également constituer une solution de rechange à la question initiale de ce fil de discussion.

-1voto

Justin Points 2376

Si vous listez la dépendance sur le projet de guerre comme une dépendance de jar, il semble récupérer les jars/ressources nécessaires. J'utilise Maven 2.2 + m2eclipse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X