Maven:强制泽西使用特定的神器版本

时间:2012-11-05 17:39:10

标签: maven jersey jena

我有一个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作为输出。

  • 预期会出现这种情况吗?
  • 怎么能强迫泽西使用ARQ 2.9.3?
  • 如果不可能,可以让RMOnto使用2.8.7,而其余的源使用2.9.3吗?

提前致谢!

3 个答案:

答案 0 :(得分:3)

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


更新

好的,我明白了问题所在。

所以你可以做的就是确保将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机制就会意识到它们。该文件似乎包含许多这样的依赖项,这将在未来引起令人头疼的问题。