2013-08-29 1 views
3

J'ai un projet multi-module construit avec maven. Je dois exécuter les tests d'intégration du projet tous les jours. Il n'est pas possible de le faire pendant le cycle de construction standard de maven, car à l'exécution, les tests d'intégration définis dans les modules ont des dépendances circulaires, que je ne peux pas déclarer sur leurs poms. Au lieu de cela, j'ai créé un projet distinct nommé Global qui répertorie tous les modules jars et tests-jars comme dépendances. Global a le même parent que tous les modules. L'idée est que, en utilisant maven-ant-tasks, je pourrai obtenir un chemin de classe de tous les modules jars et pots-tests et continuer à partir de là. La section de dépendance pom.xml Global est la suivante:Obtenir un chemin de classe pour les tests d'intégration d'un projet multi-module avec maven-ant-task

<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>A</artifactId> 
    <version>${project.version}</version> 
</dependency> 
<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>A</artifactId> 
    <version>${project.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>B</artifactId> 
    <version>${project.version}</version> 
</dependency> 
<dependency> 
    <groupId>mygroup</groupId> 
    <artifactId>B</artifactId> 
    <version>${project.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency> 

...etc 

Le problème est que je ne peux pas sembler obtenir un classpath qui contient tous les pots et test-pots déclarés sur pom.xml Global (et leurs dépendances d'exécution) en utilisant les tâches ant disponibles. J'ai essayé (entre autres choses):

<dependencies pathId="cp1" type="jar" usescope="runtime"> 
    <pom file="${basedir}/pom.xml"> 
     <profile id="DEV" /> 
    </pom> 
</dependencies> 

[1] Celui-ci récupère toutes les dépendances d'exécution. Aucun problème avec cela.

<dependencies pathId="cp2"> 
    <dependency groupId="mygroup" artifactId="Global" version="myVersion" scope="test" type="test-jar"/> 
</dependencies> 

[2] Celui-ci récupère toutes les dépendances d'exécution ainsi que Global-myversion-tests.jar, mais aucun autre jarre de test.

<dependencies pathId="cp3" type="test-jar" usescope="test"> 
    <pom file="${basedir}/pom.xml"> 
     <profile id="DEV" /> 
    </pom> 
</dependencies> 

[3] Celui-ci ne récupère rien. De toute évidence, déclarer quelque chose comme [2] une fois pour chaque module fera l'affaire, mais je cherche à créer une configuration qui n'aura pas besoin d'éditer un fichier gazillion chaque fois qu'un nouveau module est ajouté ou supprimé. BTW J'utilise maven-ant-task-2.1.3.

Merci pour toute contribution.

--- Édite pour réponse acceptée de @yannisf ---

Vous ne devriez jamais avoir des dépendances cycliques

Je suppose que vous voulez dire pour Maven construit. Ayant des dépendances cycliques sur l'exécution est assez commun, par exemple:

Module A déclare l'interface: UploadToDocumentManagementSystem

Module B implémente dans: UploadToCoolDms (cette façon à l'avenir, lorsque les changements du système DMS à module CoolerDms B peut être remplacé par une nouvelle implémentation sans effets secondaires pour le reste de l'application).

Module B dépend d'un temps de compilation (et, par définition, l'exécution ainsi)

module A dépend de B d'exécution

Maven ne permet pas de déclarer. La raison, que je peux comprendre, est que maven doit compléter des cycles de construction (y compris des tests) de projets multi-modules dans un ordre spécifique. Quoi qu'il en soit, il n'est pas vraiment nécessaire de le déclarer si vous vous débarrassez de la dépendance à l'exécution de B pour les tests de A (ce qui est une bonne pratique et devrait arriver de toute façon).

Vous devez faire les choses comme Maven au lieu de recourir à des fourmilières tâches

assez juste, je peux voir comment les tâches maven-ant-n'a pas été fait pour cet usage.

Dans votre pom global que vous déclarez types double pour le même objet (pot, pot test)

Est-ce un problème en général? Par exemple, le module A contient des échantillons pour ses tests que je voudrais également utiliser dans les tests du module B. Est-ce que c'est faux (selon les standards des meilleures pratiques de maven) de déclarer que B dépend de A jar (compile scope) et de A test-jar (test scope)? Un projet de tests d'intégration ne va-t-il pas justifier de dépendre d'un module ainsi que des échantillons et ressources du même module utilisés pour ses tests unitaires? Je vais essayer de réorganiser les tests déclarés sur les modules et de créer des modules séparés pour les tests d'intégration (en supposant que je puisse obtenir 20 développeurs pour jouer à la balle). Merci pour la réponse et pour m'avoir fait avouer ma défaite et arrêter d'essayer de faire travailler le maven avec le projet au lieu de faire fonctionner le projet avec maven :).

Répondre

2

Vous essayez de briser les conventions maven de plusieurs façons. 1. Vous ne devriez jamais avoir de dépendances cycliques, 2. Vous devez faire les choses de la même façon que les tâches fourmis 3. Dans votre pom global, vous déclarez des types doubles pour le même artefact (pot, pot de test).

Bien que cela puisse ne pas sembler répondre à votre question, vous devriez prendre du recul et repenser votre mise en page. Les tests d'intégration nécessitent toutes les dépendances et sont beaucoup plus exigeants que les tests unitaires. Ainsi, au lieu d'essayer de les intégrer dans les projets existants, créez un projet maven séparé dans le même groupe, qui n'hébergera que des tests d'intégration (sous src/java/test, principal sera vide) et aura comme dépendances tous les autres projets.

+0

Assez juste. Chose est, c'est un projet vieux de 3 ans que je viens de 'mavenized', donc pas beaucoup de marge de manoeuvre vraiment. Merci d'avoir pris le temps d'y répondre. – dkateros

+0

accepté. J'ai fait quelques modifications à la fin de la question. J'apprécierais que vous jetiez un coup d'oeil rapide. Merci encore. – dkateros

+0

[1] La dépendance à l'exécution "Le module A dépend de B à l'exécution" est une dépendance libre remplie par le conteneur qui "détecte" automatiquement les implémentations de l'interface (ou lit un XML dans le cas du ressort). Compiler les dépendances temporelles sont ce qui compte, et Maven n'acceptera pas les cycles. Même si vous trompez maven, il sera fragile, difficile à maintenir et peu orthodoxe. [2] Cool. [3] Les parties communes des tests seraient mieux déplacées vers un module séparé qui sera inclus comme dépendance de test dans tous les autres projets. – yannisf

Questions connexes