【问题标题】:Multiple Dependency Scopes in POMPOM 中的多个依赖范围
【发布时间】:2011-08-21 22:00:18
【问题描述】:

我的 POM 中有一个依赖项需要设置为“已提供”,因此它不包含在编译中,但它仍然可以在我的项目中引用。当我去运行测试时,我希望相同的依赖项具有“测试”范围,因此我不必手动将 jar 添加到我的类路径中。有没有办法做到这一点或达到类似的结果?

这背后的原因是我的 JBOSS lib 目录中提供了一些常见的 jar,所以我想使用这些并为构建的战争保留它们的“提供”范围。但是,当我从命令行运行 JUnits 时,我想使用存储库中的 jar,而无需手动将其添加到我的类路径中。

提前致谢

【问题讨论】:

  • 你在使用surefire插件来运行单元测试吗?
  • 请澄清您是指使用“编译”和“运行测试”的阶段还是不同的构建(请参阅下面的我的答案和 cmets)。

标签: maven-2 maven dependency-management pom.xml


【解决方案1】:

来自maven documentation

provided 这很像 compile,但表示您期望 JDK 或在运行时提供依赖项的容器。例如,当 为 Java 企业版构建一个 Web 应用程序,您将 将 Servlet API 和相关 Java EE API 的依赖设置为 提供范围是因为 Web 容器提供了这些类。 这个 范围仅在编译和测试类路径中可用,并且是 不及物。

我在 maven 3.0.3 中检查了这对我有用。有同样的问题,我需要在编译和测试时有一个 servlet 依赖项,但没有编译,因为它随应用程序服务器分发一起提供。

【讨论】:

  • 这是正确的答案,至少对于我的用例而言。 @Steve,您应该将其标记为已接受:)
【解决方案2】:

您可以使用将这些依赖项声明为测试或提供的配置文件 - 取决于您更方便的方式:

<profiles>
    <profile>
        <id>whatever</id>
        <activation>
            <property>
                <name>env</name>
                <value>whatever</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>test</id>
        <activation>
            <property>
                <name>env</name>
                <value>test</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

这些配置文件通过设置属性 env 被激活,但还有其他方法,例如。默认激活 - 看看here

【讨论】:

  • 我认为 OP 希望在 same 构建中提供和测试范围。
  • @Andrew Spencer:我认为只是有不同的用例,除了他指的是同一个版本中的测试。当然,这将是另一回事......
  • 这不是 Maven 方式!无论哪个配置文件处于活动状态,依赖关系都应该是稳定的!
  • @MartinHöller:我明白你的意思,但为什么依赖部分包含在配置文件中?当您需要其他依赖项时,可能会有用例 - 这可能不会影响您部署的构建结果。
  • 也许这是个好主意,也许不是,但正如这里“解释”的那样,它绝对无法使用。引用的文档也是如此。 Apache 的软件很好,但它的文档很少解释。
【解决方案3】:

尝试两次声明依赖关系,每个范围一次。在 Maven 2.2.1 中工作。

依赖解析会发生令人困惑的事情,当同一个工件在依赖树中两次具有不同的范围时,但我不认为在你的情况下这应该是一个问题。

【讨论】:

  • 在 Maven 3.0.5 这个解决方案导致[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. For this reason, future Maven versions might no longer support building such malformed projects.
【解决方案4】:

有同样的问题,我需要两个作用域来实现相同依赖的原因是相位集成测试我使用 jetty-plugin 运行休息服务,并在 jetty 运行时进行一些 JUnit 测试,但我为 jboss 编译了我的包因为,我已经有了“resteasy-cdi”,而不是码头 servlet 容器缺席......我还没有找到解决方案。

【讨论】:

    【解决方案5】:

    使用 maven-surefire-plugin 运行您的 junit 测试。提供的范围也将使其在测试类路径中可用。

    【讨论】:

      【解决方案6】:

      请在Maven中找到范围的确切含义

      我参考了 Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

      依赖范围用于限制依赖的传递性,也用于影响用于各种构建任务的类路径。

      有 6 个可用范围:

      编译:-

      这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项会传播到相关项目。

      提供:-

      这很像编译,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java Enterprise Edition 构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为提供的范围,因为 Web 容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递。

      运行时:-

      这个范围表示依赖不是编译所必需的,而是执行所必需的。它在运行时和测试类路径中,但不在编译类路径中。

      测试:-

      此范围表示该依赖不是应用正常使用所必需的,仅适用于测试编译和执行阶段。

      系统:-

      这个范围类似于提供的,除了你必须提供明确包含它的 JAR。工件始终可用,不会在存储库中查找。 import(仅在 Maven 2.0.9 或更高版本中可用):- 此范围仅用于该部分中 pom 类型的依赖项。它指示应将指定的 POM 替换为该 POM 部分中的依赖项。由于它们被替换,具有导入范围的依赖项实际上并不参与限制依赖项的传递性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 2019-08-27
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 2017-10-25
        • 2022-12-06
        相关资源
        最近更新 更多