Maven:在不同的jar中实现相同路径的多个类

时间:2010-04-10 08:21:31

标签: maven-2 dependencies

我遇到了多个具有相同路径的类(即同名,相同的包!!!)。 出于某种原因,gwt-dev附带了自己的org.apache.xerces.jaxp.DocumentBuilderFactoryImpljavax.xml.parsers.DocumentBuilderFactory版本。

与此同时,春天也取决于这些类别,但来自不同的罐子。我不知道应该是什么,但看起来像xalan& xml-api是spring依赖的两个依赖项(这些依赖项是可选的)

有趣的是,eclipse可以运行相同的代码(它是一个单元测试)而没有问题,但是确定无法。所以我想这个问题是由于每个跑步者考虑每个罐子的优先级的方式。

现在回答这个问题:如何设置我的POM,以便我可以确定当我的应用程序内部运行任何代码时,jar中的类将从其他jar中选择?

感谢。

3 个答案:

答案 0 :(得分:14)

  

现在回答这个问题:如何设置我的POM,以便我可以确定当我的应用程序内部运行任何代码时,jar中的类将从其他jar中选择?

从Maven 2.0.9开始,Maven使用POM中依赖项的顺序来构建类路径,以便可以操作它。只需先声明“正确”的jar,你的应用就会从中挑选出来。

来自maven 2.0.9的发行说明:

  

MNG-1412 / MNG-3111在类路径上引入了依赖关系的确定性排序。在过去,使用自然集排序,这导致奇怪的结果。现在可以从您的pom中保留排序,并通过最后添加的继承添加依赖项。在具有冲突或重复依赖性的构建中,这可能会引入对输出的更改。简而言之,如果您遇到奇怪的2.0.9问题,请查看依赖关系,看看您是否在某处发生冲突。

答案 1 :(得分:0)

maven项目中的依赖关系可能是一个麻烦的故障排除。我通常做的是......

    项目上的
  • mvn依赖关系:树,以查看哪些人对您的课程有依赖性。
  • 通过编辑pom.xml来尝试excluding您认为会产生问题的课程。

希望这有帮助!

答案 2 :(得分:0)

要知道哪个jar导致问题:使用-X标志运行Maven。

设置POM以排除相关的jar:

<yourproject.deployment.excludes>
  artifactId1,artifactId2,...
</yourproject.deployment.excludes>

...

 <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>