2

我有一个 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 Plugin 等您不会注意到它。

看起来这会导致 Jersey 使用 RMOnto 的 ARQ 版本,而不是 pom.xml 中定义的版本。这是一个最小的例子。当您运行测试时(检查 ARQ.VERSION 是否等于 2.9.3),它会成功。当您构建项目并将其部署在 Tomcat 7 上时,您应该会看到 2.8.7 作为输出。

  • 这种行为是预期的吗?为什么?
  • 一个人怎么能强迫泽西岛使用 ARQ 2.9.3?
  • 如果不可能,是否可以隔离 ROnto 以使用 2.8.7 而其他源使用 2.9.3?

提前致谢!

4

3 回答 3

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 文件之前加载。

注意:我没有在 Tomcat 上测试过,但我看不出它不起作用。

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

于 2012-11-05T18:11:00.243 回答
1

如果文件已被直接复制到 RMOnto .jar,则该行为是预期的。

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

如果您愿意,最好删除 RMOnto 的 pom 文件中未提及的其他依赖项,然后将它们添加到 RMOnto pom 文件中(并重建,如果您有源代码)。这样 Maven 机制就会知道它们。该文件似乎包含很多这样的依赖项,这将导致未来的头痛。

于 2012-11-06T06:48:58.323 回答
1

You should file a defect report against RMOnto. Hard-wiring library code into a jar, instead of including it as a dependency you can manage in the POM, is definitely a bad idea that the code maintainer should fix.

于 2012-11-05T23:36:54.697 回答