6
votes

Maven: classe multiple avec le même chemin mis en œuvre dans un pot différent

Je rencontre des ennuis avec une classe multiple avec le même chemin (c'est le même nom, même paquet !!!). Pour une raison quelconque, GWT-DV est livré avec sa propre version de org.apache.xerces.jaxp.documentbuilderfactoryimpl et javax.xml.parsers.documentbuilderfactory . .

En même temps, le printemps dépend également de ces classes, mais de différents pot. Je ne sais pas ce qui devrait être, mais ressemble à xalan & XML-API sont les deux dépendances que le ressort dépend de (ces dépendances sont facultatives)

Une chose drôle est que Eclipse peut exécuter le même code (c'est un test unitaire) sans problème, mais Surefire ne peut pas. Je suppose donc que le problème est dû à la façon dont chaque coureur considère la priorité de chaque bocal.

Venez maintenant à la question suivante: Comment puis-je configurer mon POM afin que je puisse être sûr que lorsque tout le code exécutant à l'intérieur de mon application, la classe d'un pot sera sélectionnée sur la classe d'un autre bocal?

Merci.


0 commentaires

3 Réponses :


0
votes

Les dépendances au sein de projets Maven peuvent être tracas pour résoudre les problèmes de dépannage. Ce que je fais normalement, c'est ...

  • dépendance MVN: arborescence sur votre projet pour voir qui a une dépendance sur les classes vous donnant des problèmes.
  • essayez excluant le Classes que vous pensez donner problème en modifiant votre POM.XML.

    J'espère que cela vous aide!


1 commentaires

Eh bien, j'ai encore besoin de la dépendance qui introduisent les problèmes. Je veux seulement la prioriser à bas prix.



0
votes

Pour savoir quel pot vous cause des problèmes: exécutez Maven avec le drapeau -x.

Pour configurer votre POM pour exclure le (s) bocal (s) pertinent (s): p>

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${your.lib.for.example}</outputDirectory>
          <overWriteSnapshots>true</overWriteSnapshots>
          <overWriteIfNewer>true</overWriteIfNewer>
          <excludeTransitive>false</excludeTransitive>
          <excludeArtifactIds>${yourproject.deployment.excludes}</excludeArtifactIds>
          <includeScope>compile</includeScope>
        </configuration>
      </execution>
    </executions>
  </plugin>


0 commentaires

15
votes

Venez maintenant à la question suivante: Comment puis-je configurer mon POM afin que je puisse être sûr que lorsque tout le code exécutant à l'intérieur de mon application, la classe d'un pot sera sélectionnée sur la classe d'un autre bocal?

Depuis Maven 2.0.9, Maven utilise l'ordre des dépendances dans le POM pour construire le point de classe afin que vous puisse le manipuler. Déclarez simplement le JAR «Droite» d'abord et votre application choisira la classe de celle-ci.

des notes de sortie de Maven 2.0.9:

MNG-1412 / MNG-3111 a introduit un ordre déterministe des dépendances sur la classe de classe. Dans le passé, un commandement naturel a été utilisé et cela conduit à des résultats étranges. La commande est maintenant préservée de votre POM, avec des dépendances ajoutées par héritage ajoutées en dernier. Dans les constructions qui avaient des dépendances conflictuelles ou en double, cela peut introduire une modification de la production. En bref, si vous avez des problèmes étranges avec 2.0.9, examinez les dépendances pour voir si vous avez des conflits quelque part.


1 commentaires

Merci pour votre explication. J'ai essayé de réorganiser mon POM mais cela n'a pas tiré sur le problème. On dirait que ce n'est plus un problème d'ordre de dépendance. J'ai posé une autre question ici: Stackoverflow.com/questions/2619880/... .