【问题标题】:Maven: Force Jersey to use specific artifact versionMaven:强制 Jersey 使用特定的工件版本
【发布时间】:2012-11-05 17:39:09
【问题描述】:

我有一个 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 中定义的版本。这是minimal example。当您运行测试时(检查 ARQ.VERSION 是否等于 2.9.3),它会成功。当您构建项目并将其部署在 Tomcat 7 上时,您应该会看到 2.8.7 作为输出。

  • 这种行为是预期的吗?为什么?
  • 如何强制 Jersey 使用 ARQ 2.9.3?
  • 如果不可能,是否可以隔离 RMOnto 以使用 2.8.7 而其他源使用 2.9.3?

提前致谢!

【问题讨论】:

    标签: maven jersey jena


    【解决方案1】:

    您应该首先在依赖项列表中定义 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>
    

    您的战争和爆炸战争现在将包含来自 ARQ 2.9.3 的所有类,位于 WEB-INF/classes 文件夹中。它们将在 WEB-INF/lib 文件夹中的任何 jar 文件之前加载。

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

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

    【讨论】:

    • 首先定义:pom.xml (jena-tdb 0.9.3)。还是您的意思是“明确定义”?
    • 首先在依赖项中明确定义 ARQ 2.9.3。不是在谈论jena-tbd。
    • 好吧,没用。请参阅updated pom。我(按此顺序)运行 maven clean、更新 maven 工件、清理和构建项目、maven 安装。两次。测试仍然成功(这意味着测试环境中的 ARQ 版本为 2.9.3),但部署在 Tomcat 上显示为 2.8.7(不需要)。
    • 如您所见here,他们似乎使用了maven-shade-plugin。 Shade 插件将所有依赖项放入一个 Über jar 中。这当然是你手头的问题。
    • 是的,我们从维护者那里得到了源代码。在那里,我们将 ARQ 依赖项移至其 POM 文件。我们将他们的整个项目包括在我们的项目中(多 Maven 项目)。 jar 仍然有阴影,但我们可以选择版本。现在可以了。
    【解决方案2】:

    您应该针对 RMonto 提交缺陷报告。将库代码硬连接到 jar 中,而不是将其作为可以在 POM 中管理的依赖项包含在内,这绝对是代码维护者应该修复的一个坏主意。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-02-01
        • 2012-04-23
        • 2022-07-28
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多