43

有谁知道在 Maven2 中设置特定类路径顺序的方法,而不是我目前似乎经历的随机顺序?

想要这样做有很多正当理由:

  • 供应商提供了一个补丁 jar,其中包含先前发布的 jar 的覆盖类,因此补丁 jar 必须首先出现在类路径排序中。
  • 通过遍历 pom 依赖项发现的类路径上找到的两个 jar 在同一个包中包含具有不同签名的相同类。例如:

jboss jbossall-client 4.2.0.GA

org.hibernate 休眠 3.1

两者都包含:org.hibernate.util.ReflectHelper.class,但 jbossall-client 版本缺少 getFastClass 方法。

通过谷歌搜索,我发现这可能是 maven 爱好者和面临这个特定问题的人之间的争论点,但类路径排序肯定有正当理由。

任何解决这个特殊难题的人的任何建议都将不胜感激!

谢谢

4

2 回答 2

40

从 2.0.9 版开始,maven 对类路径使用 pom 顺序,因此您现在可以实际操作它。我们主要抑制对我们也直接包含的外部库的传递依赖。

来自 maven 2.0.9 的发行说明:

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

于 2009-04-27T12:00:27.497 回答
2

Maven 2.0.9 添加了正确的顺序,因此您绝对必须拥有该版本或更高版本才能正常工作。

其次,您需要更新的插件。Maven 家伙正在努力修复,它在他们的 jira 中修复,但这是我迫切需要的。所以与此同时,我自己修复了这个问题,你可以从 github中提取修改后的插件源代码。

编辑:参考http://jira.codehaus.org/browse/MECLIPSE-388

有两种安装方法,要么拉我修改过的代码并安装它,要么下载预构建的 jar 并添加它。

构建插件

maven install从您签出的插件目录运行,然后在项目 pom 的插件部分中添加以下内容:

<build>
  </plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-eclipse-plugin</artifactId>
      <version>2.8-cpfix</version>
    </plugin>
  </plugins>
</build>

下载罐子

或者,如果您不想自己下载和编译,那么您可以获取jar 文件并自己安装。

运行文件后

mvn install:install-file -Dfile=<path-to-file> -DgroupId=org.apache.maven.plugins \
    -DartifactId=maven-eclipse-plugin -Dversion=2.8-cpfix -Dpackaging=jar

无论您现在如何安装它,当您运行mvn eclipse:eclipse它时,它都会根据您在 pom 文件中定义的顺序获取修改后的代码并排序依赖项,不按字母顺序排列。它还将 JRE 容器放在依赖项的顶部。

希望这段代码的真实版本很快就会出来,但与此同时,这个修复对我的项目有用,我希望它也能帮助其他一些人。

于 2010-07-17T17:06:53.580 回答