我有一个Maven存储库,我加载Jena TDB 0.9.3(取决于Jena ARQ 2.9.3),Jersey 1.8和RMOnto 1.0。正如您所料,重点是对语义数据集进行一些分析。
看起来RMOnto内置了ARQ 2.8.7,就像“硬连线”一样。它的pom文件中没有任何显式依赖项,但jar文件包含ARQ.class
。这非常棘手,因为你不会用Maven Enforcer插件等注意它。
看起来这会导致Jersey使用RMOnto的ARQ版本而不是pom.xml中定义的版本。这是一个minimal example。当您运行测试(检查ARQ.VERSION是否等于2.9.3)时,它会成功。当您构建项目并将其部署在Tomcat 7上时,您应该看到2.8.7作为输出。
提前致谢!
答案 0 :(得分:3)
您应首先在依赖项列表中定义ARQ 2.9.3。通过这样做,您强制您的构建使用该特定版本。在选择要使用的工件时,依赖顺序是相关的。
好的,我明白了问题所在。
WEB-INF/lib
中的jar。这意味着即使您将ARQ 2.9.3定义为依赖项中的第一个,但在Tomcat中运行应用程序时也不会这样。 http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html WEB-INF/classes
之前查看WEB-INF/lib
的依赖关系。所以你可以做的就是确保将ARQ 2.9.3版本添加到WEB-INF/classes
文件夹中。这可以使用maven-dependency-plugin
:
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.apache.jena</groupId>
<artifactId>jena-arq</artifactId>
<version>2.9.3</version>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<excludes>**/META-INF/</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
您的战争以及爆炸的战争现在将包含WEB-INF/classes
文件夹中ARQ 2.9.3的所有类。它们将在WEB-INF/lib
文件夹中的任何jar文件之前加载。
NB:我没有在Tomcat上测试过这个,但我看不出它会起作用。
NB2:这是一个黑客攻击。最好的办法是从RMOnto jar中删除ARQ包。
答案 1 :(得分:1)
您应该针对RMOnto提交缺陷报告。将库代码硬连接到jar中,而不是将其作为可以在POM中管理的依赖项包含在内,这绝对是代码维护者应该修复的坏主意。
答案 2 :(得分:1)
如果文件已直接复制到RMOnto .jar,则会出现此行为。
在这种情况下,我认为最好的办法是将其硬编码,即直接从包中删除ARQ文件。打开RMOnto-1.0.jar包,可以看到arq文件夹中的arq文件。你需要做的是打开jar文件(它只是一个.zip),从那里删除ARQ文件,将编辑好的RMOnto包存储在你的版本控制/存储库中,并从那里参考编辑过的包。此外,您需要在旧版本的ARC中为您的pom添加excludes语句,并将依赖项保持为新版本。
如果您愿意,最好删除RMOnto的pom文件中未提及的其他依赖项,然后将它们添加到RMOnto pom文件中(如果您有源代码,则重建它们) )。这样Maven机制就会意识到它们。该文件似乎包含许多这样的依赖项,这将在未来引起令人头疼的问题。