Maven:强制Jersey使用特定的工件版本

Maven:强制Jersey使用特定的工件版本,maven,jersey,jena,Maven,Jersey,Jena,我有一个Maven存储库,在其中加载Jena TDB 0.9.3(取决于Jena ARQ 2.9.3)、Jersey 1.8和。正如您所期望的,重点是对语义数据集进行一些分析 看起来RMONO内置了ARQ 2.8.7,就像“硬连线”一样。它的pom文件中没有任何明确的依赖项,但是jar文件包含一个ARQ.class。这是非常棘手的,因为使用Maven Enforcer插件之类的工具,您不会注意到它 这似乎导致Jersey使用RMOnto的ARQ版本,而不是pom.xml中定义的版本。这是一本书。

我有一个Maven存储库,在其中加载Jena TDB 0.9.3(取决于Jena ARQ 2.9.3)、Jersey 1.8和。正如您所期望的,重点是对语义数据集进行一些分析

看起来RMONO内置了ARQ 2.8.7,就像“硬连线”一样。它的pom文件中没有任何明确的依赖项,但是jar文件包含一个
ARQ.class
。这是非常棘手的,因为使用Maven Enforcer插件之类的工具,您不会注意到它

这似乎导致Jersey使用RMOnto的ARQ版本,而不是pom.xml中定义的版本。这是一本书。运行测试时(检查ARQ.VERSION是否等于2.9.3),测试成功。当您构建项目并将其部署到Tomcat7上时,您应该将2.8.7作为输出

  • 这种行为是预期的吗?为什么
  • 如何强制泽西使用ARQ 2.9.3
  • 在不可能的情况下,是否可以将RMONO隔离为使用2.8.7,而源代码的其余部分使用2.9.3

提前谢谢

您应该首先在依赖项列表中定义ARQ 2.9.3。通过这样做,您可以强制构建使用该特定版本。当选择要使用的工件时,依赖顺序是相关的


更新 好的,我明白问题所在

  • 根据pom:,RMOnto罐明显有阴影
  • Tomcat7以未定义的顺序加载
    WEB-INF/lib
    中的JAR。这意味着,即使将ARQ 2.9.3定义为依赖项中的第一个,当应用程序在Tomcat中运行时也不会出现这种情况
  • 好消息是Tomcat总是在
    WEB-INF/classes
    之前查看
    WEB-INF/lib
    中的依赖项
因此,您可以做的是确保将ARQ 2.9.3版本添加到
WEB-INF/classes
文件夹中。这可以通过以下方式完成:


maven依赖插件
准备包装
打开
org.apache.jena
耶拿arq
2.9.3
${project.build.directory}/classes
**/META-INF/
您的war以及您的分解war现在将包含
WEB-INF/classes
文件夹中ARQ 2.9.3中的所有类。它们将在
WEB-INF/lib
文件夹中的任何jar文件之前加载

NB:我还没有在Tomcat上测试过这个,但我看不出它会不起作用


NB2:这是一个黑客攻击。最好的办法是从RMOnto jar中删除ARQ包

您应该针对RMONO提交缺陷报告。将库代码硬连接到一个jar中,而不是将其作为可以在POM中管理的依赖项,对于代码维护人员来说,这绝对是一个坏主意。

如果文件已直接复制到RMOnto.jar中,那么这种行为是可以预料的

在这种情况下,我认为最好的办法是硬编码,即直接从包中删除ARQ文件。打开RMOnto-1.0.jar包,可以看到arq文件夹中的arq文件。您需要做的是打开jar文件(它只是一个.zip文件),从那里删除ARQ文件,将编辑好的RMOnto包存储在您的版本控制/存储库中,并从那里引用编辑好的包。另外,对于旧版本的ARC,您需要向pom中添加excludes语句,并保持对新版本的依赖性


如果您愿意,最好删除RMONO的pom文件中没有提到的其他依赖项,然后将它们添加到RMOnto pom文件中(如果您有源代码,还可以重新生成)。这样Maven机制就会意识到它们。该文件似乎包含许多类似这样的依赖项,这将在将来引起麻烦。

首先定义它:(jena tdb 0.9.3)。或者您的意思是“显式定义”?在依赖项中首先显式定义ARQ 2.9.3。不是说jena-tbd,好吧,那没用。看。我(按此顺序)运行了maven清理、更新maven工件、清理和构建项目、maven安装。两次。测试仍然成功(这意味着测试环境中的ARQ版本是2.9.3),但是部署在Tomcat上,它显示了2.8.7(不需要)。Shade插件获取所有依赖项并放入一个Über jar中。这当然是你手头的问题。是的,我们从维护人员那里得到了源代码。在那里,我们将ARQ依赖项移到了它的POM文件中。我们将他们的整个项目包括在我们的项目中(multi-maven项目)。罐子仍有阴影,但我们可以选择版本。现在可以了。