web-dev-qa-db-fra.com

Plusieurs portées de dépendance dans POM

J'ai une dépendance dans mon POM qui doit être définie sur "fourni", elle n'est donc pas incluse dans la compilation, mais elle peut toujours être référencée dans mon projet. Je voudrais que la même dépendance ait une portée de "test" lorsque je vais exécuter des tests afin de ne pas avoir à ajouter manuellement le fichier jar à mon chemin de classe. Y a-t-il un moyen de faire cela ou d'obtenir des résultats similaires?

Cela tient au fait que certains jars courants sont fournis dans mon répertoire JBOSS lib. Je souhaite donc les utiliser et en conserver la portée "fournie" pour la guerre construite. Cependant, lorsque j'exécute JUnits à partir de la ligne de commande, je souhaite utiliser le fichier jar du référentiel sans l'ajouter manuellement à mon chemin d'accès aux classes.

Merci d'avance

33
Steve

De documentation maven :

fourni Cela ressemble beaucoup à la compilation, mais indique que vous vous attendez à ce que le JDK ou un conteneur fournisse la dépendance au moment de l'exécution. Par exemple, lorsque Crée une application Web pour Java Enterprise Edition, vous devez Définir la dépendance de l'API Servlet et des API Java EE associées à la portée Fournie, car le conteneur Web fournit ces cours. Cette étendue Est uniquement disponible sur le classpath de compilation et de test et est Non transitive.

J'ai vérifié cela fonctionne pour moi dans maven 3.0.3. Avait le même problème que j'avais besoin d'avoir une dépendance de servlet lors de la compilation et le test, mais pas compilé dans car il est livré avec la distribution du serveur d'applications.

29
fyr

Vous pouvez utiliser un profil qui déclare ces dépendances comme test ou comme prévu, selon ce qui vous convient le mieux:

<profiles>
    <profile>
        <id>whatever</id>
        <activation>
            <property>
                <name>env</name>
                <value>whatever</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>test</id>
        <activation>
            <property>
                <name>env</name>
                <value>test</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

Ces profils sont activés en définissant la propriété env ​​mais il existe d’autres moyens, par exemple f.e. activation par défaut - regardez ici pour cela.

6
Jan

Essayez de déclarer la dépendance deux fois, une fois avec chaque étendue. Fonctionne dans Maven 2.2.1.

La résolution de la dépendance crée des situations confuses, lorsque le même artefact se trouve deux fois dans l’arbre de dépendance avec des portées différentes, mais je ne pensez pascela devrait être un problème dans votre cas.

3
Andrew Spencer

Avoir le même problème, raison pour laquelle j'ai besoin de deux portées pour la même dépendance est sur la phase intégrant le test j'utilise jetty-plugin pour le service de repos, et fais quelques tests de JUnit pendant que jetty est en cours d'exécution, mais je compile mon paquet pour jboss as, où j'ai déjà "resteasy-cdi", qu'absent pour le conteneur de servlet de jetée ... Je n'ai pas encore trouvé de solution.

2
Pavel

Utilisez le plugin maven-surefire pour exécuter vos tests Junit. La portée de fournie le rendra également disponible sur le classpath de test.

0
Christopher

Trouvez la signification exacte des champs d'application en Maven

J'ai référé à Maven http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html

La portée de dépendance est utilisée pour limiter la transitivité d'une dépendance et également pour affecter le chemin d'accès aux classes utilisé pour diverses tâches de construction.

Il y a 6 portées disponibles:

compiler: -

C'est la portée par défaut, utilisée si aucune n'est spécifiée. Les dépendances de compilation sont disponibles dans tous les chemins de classes d'un projet. De plus, ces dépendances sont propagées aux projets dépendants.

fourni: -

Cela ressemble beaucoup à la compilation, mais indique que vous vous attendez à ce que le JDK ou un conteneur fournisse la dépendance au moment de l'exécution. Par exemple, lors de la création d'une application Web pour Java Enterprise Edition, vous devez définir la dépendance de l'API Servlet et des API Java EE associées sur la portée fournie, car le conteneur Web fournit ces classes. Cette portée est uniquement disponible sur le chemin de classe de compilation et de test et n'est pas transitive.

runtime: -

Cette portée indique que la dépendance n'est pas requise pour la compilation, mais pour l'exécution. C'est dans les classpaths d'exécution et de test, mais pas le classpath de compilation.

test: -

Cette étendue indique que la dépendance n'est pas requise pour une utilisation normale de l'application et n'est disponible que pour les phases de compilation et d'exécution du test.

système: -

Cette étendue est similaire à fournie sauf que vous devez fournir le fichier JAR qui le contient explicitement. L'artefact est toujours disponible et n'est pas recherché dans un référentiel. import (disponible uniquement dans Maven 2.0.9 ou version ultérieure): - Cette étendue est uniquement utilisée pour une dépendance de type pom dans la section. Cela indique que le POM spécifié doit être remplacé par les dépendances de la section de ce POM. Dans la mesure où elles sont remplacées, les dépendances avec une étendue d'importation ne participent pas réellement à la limitation de la transitivité d'une dépendance.

0
Pavan