Exclure toutes les dépendances transitives d’une seule dépendance

Dans Maven2, pour exclure une seule dépendance transitive, je dois faire quelque chose comme ceci:

 sample.group sample-artifactB 1   sample.group sample-artifactAB    

Le problème avec cette approche est que je dois le faire pour chaque dépendance transitive apscope par sample-artifactB .

Existe-t-il un moyen d’utiliser une sorte de caractère générique pour exclure toutes les dépendances transitives au lieu d’une par une?

    Pour maven2, il n’y a pas moyen de faire ce que vous décrivez. Pour maven 3, il y a. Si vous utilisez maven 3, consultez une autre réponse à cette question.

    Pour maven 2, je vous recommande de créer votre propre pom personnalisé pour la dépendance qui contient vos . Pour les projets qui doivent utiliser cette dépendance, définissez la dépendance sur votre pom personnalisé au lieu de l’artefact classique. Bien que cela ne vous permette pas nécessairement d’exclure toutes les dépendances transitives avec une seule , cela vous permet seulement d’écrire votre dépendance une fois et tous vos projets n’ont pas besoin de maintenir des listes d’exclusion longues et inutiles.

    Ce qui a fonctionné pour moi (peut-être une nouvelle fonctionnalité de Maven) consiste simplement à utiliser des jokers dans l’élément d’exclusion.

    J’ai un projet multi-module qui contient un module “app” référencé dans deux modules empaquetés par WAR. L’un de ces modules empaquetés par WAR nécessite uniquement les classes de domaine (et je ne les ai pas encore séparées du module d’application). J’ai trouvé ça pour travailler:

      ${project.groupId} app ${project.version}   * *    

    Les caractères génériques figurant à la fois sur groupId et artefactId excluent toutes les dépendances qui se propageraient normalement au module à l’aide de cette dépendance.

    Une chose que j’ai trouvé utile:

    Si vous placez la dépendance avec les exclusions dans la section dependencyManagement du POM parent pour votre projet ou dans un POM de gestion des dépendances importable, vous n’avez pas besoin de répéter l’exclusion (ou la version).

    Par exemple, si votre POM parent a:

       ...  commons-fileupload commons-fileupload 1.2.1   junit junit    ....   

    Ensuite, les modules de votre projet peuvent simplement déclarer la dépendance comme:

       commons-fileupload commons-fileupload  

    Le POM parent indiquera à la fois la version et les exclusions. J’utilise cette technique pour presque tous nos projets et cela élimine beaucoup de répétitions.

    Il y a trois ans, j’ai recommandé d’utiliser la version 99 Does Not Exist, mais maintenant j’ai trouvé un meilleur moyen, surtout depuis que la version 99 est hors ligne:

    Dans le POM parent de votre projet, utilisez maven-enforcer-plugin pour échouer à la génération si la dépendance indésirable se glisse dans la génération. Cela peut être fait en utilisant la règle des dépendances interdites du plugin:

      maven-enforcer-plugin 1.0.1   only-junit-dep-is-used  enforce      junit:junit        

    Ensuite, lorsque cela vous avertit d’une dépendance indésirable, excluez-la de la section du POM parent:

      org.springframework.batch spring-batch-test 2.1.8.RELEASE   junit junit    

    De cette façon, la dépendance indésirable n’apparaîtra pas accidentellement (contrairement à une simple qui est facile à oublier), elle ne sera pas disponible même au moment de la compilation (contrairement à la scope provided ). ) et cela fonctionnera sans un référentiel personnalisé (contrairement à la version 99). Cette approche fonctionnera même sur la base de la version de l’artefact, des classificateurs, de la scope ou d’un groupeId complet – voir la documentation pour plus de détails.

    J’utilise la solution de contournement suivante: au lieu d’essayer d’exclure l’artefact dans toutes les dépendances appropriées, je dessine la dépendance “fournie” au niveau supérieur. Par exemple, pour éviter d’envoyer xml-apis “quelle que soit la version”:

       xml-apis xml-apis [1.0,] provided  

    Actuellement, il n’y a aucun moyen d’exclure plus d’une dépendance transitive à la fois, mais il existe une demande de fonctionnalité pour cela sur le site JAVA de Maven:

    https://issues.apache.org/jira/browse/MNG-2315

    Il existe une solution à ce problème: si vous définissez l’étendue d’une dépendance à l’ exécution , les dépendances transitives seront exclues. Bien que cela signifie que vous devez append un traitement supplémentaire si vous souhaitez empaqueter la dépendance à l’exécution.

    Pour inclure la dépendance d’exécution dans un emballage quelconque, vous pouvez utiliser l’ objective de copie du plugin maven-dependency-plugin pour un artefact spécifique .

    Si vous devez exclure toutes les dépendances transitives d’un artefact de dépendance que vous allez inclure dans un assembly, vous pouvez le spécifier dans le descripteur de l’assembly-plugin:

      myApp  zip    false *:struts2-spring-plugin:jar:2.1.6    

    Si vous développez sous Eclipse, vous pouvez dans le graphe de dépendance de l’éditeur POM (tabs avancés activés) rechercher la dépendance à exclure de votre projet, puis:

    faites un clic droit dessus -> “Excluez Maven Artifact …” et Eclipse fera l’exclusion pour vous sans avoir besoin de savoir sur quelle dépendance la lib est liée.

    Quelle est votre raison pour exclure toutes les dépendances transitives?

    S’il existe un artefact particulier (tel que la consignation de fichiers communs) que vous devez exclure de chaque dépendance, l’approche Version 99 n’existe pas peut être utile.


    Mise à jour 2012: n’utilisez pas cette approche. Utilisez le plugin maven-enforcer et les exclusions . La version 99 produit des dépendances fausses et le référentiel de la version 99 est hors ligne (il existe des miroirs similaires, mais vous ne pouvez pas compter sur eux pour restr en ligne pour toujours; mieux vaut utiliser uniquement Maven Central).

    Dans un problème similaire, j’avais la dépendance souhaitée déclarée avec la scope fournie. Avec cette approche, les dépendances transitives sont récupérées mais ne sont PAS incluses dans la phase du package, ce que vous voulez. J’aime aussi cette solution en termes de maintenance, car il n’y a pas de pom, ou de pom personnalisé comme dans la solution de whaley, à maintenir; vous devez seulement fournir la dépendance spécifique dans le conteneur et être fait

    Utilisez le dernier maven dans votre chemin de classe. Il supprimera les artefacts dupliqués et conservera le dernier artefact Maven.

    Vous pouvez utiliser exclude, mais vous devez lister manuellement chaque dépendance à exclure…

      sample.group sample-artifactB 1   sample.group sample-artifactAB