web-dev-qa-db-fra.com

Dépendance de Maven WAR

J'écris un projet pour les tests d'acceptation et pour diverses raisons cela dépend d'un autre projet qui est emballé comme un WAR. J'ai réussi à décompresser le WAR à l'aide du plugin maven-dependency, mais je ne peux pas faire en sorte que mon projet inclue le _ WEB-INF/lib/*.jar et WEB-INF/classes/* à inclure dans le chemin de classe afin que la construction échoue. Existe-t-il un moyen d'inclure ces fichiers dans le chemin de classe ou existe-t-il un meilleur moyen de dépendre d'un WAR?

Merci beaucoup.

79
deelo55

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>
110
Christoph Leiter

En effet, de par sa 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 il 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. Ma compréhension de la solution proposée est de dupliquer les dépendances, par exemple dans un projet de type pom.


(EDIT: Après quelques recherches supplémentaires, 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 au cours du dernier mois où nous utilisons beaucoup la fonction de superposition de guerre dans le plugin de guerre Maven. C'est une fonctionnalité vraiment chouette!

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

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

Le plugin est maintenant activement utilisé dans le projet AppFuse au cours des derniers mois, et je pense qu'il est à un point où il est à la fois utilisable et stable. L'équipe du plugin de guerre serait-elle intéressée à inclure la fonctionnalité warpath dans le plugin de guerre? Il semblerait que ce soit l'endroit le plus naturel pour l'héberger.

Donc, je n'ai aucune expérience avec cela, mais le plugin maven warpath est en fait agréable et simple et est disponible dans le dépôt central. Pour l'utiliser, incluez l'élément de configuration de plugin suivant dans votre 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 guerre que vous souhaitez inclure dans le chemin de classe en tant que dépendances de type warpath :

[...]
<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 nécessaires: le type war est utilisé par le plugin de guerre Maven pour faire la superposition de guerre, le type warpath est utilisé par le plugin Warpath pour déterminer la liste correcte des artefacts à inclure dans le chemin de classe du projet.

Je ferais un essai.)

23
Pascal Thivent

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

Déclarez le projet de dépendance de guerre que vous souhaitez tester:

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

puis configurez la superposition 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.

13
cetnar

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

  • duplication de la dépendance de guerre comme type pom

travaux! La guerre et ses dépendances transitoires ne sont pas incluses dans l'Assemblée. Pour exclure le fichier pom (qui apparaît maintenant également), j'ai dû ajouter un élément d'exclusion comme celui-ci:

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

dans mon fichier Assembly.xml.

Je pense que cela pourrait également être une solution de contournement pour la question d'origine de ce fil.

4
Niels