maven 2 - POM 中的多个依赖关系范围



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

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

提前致谢

来自 maven 文档:

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

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

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

<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 来激活,但还有其他方法,例如默认激活 - 请在此处查看。

尝试声明依赖项两次,每个作用域一次。 在 Maven 2.2.1 中工作。

当相同的工件在依赖树中两次具有不同作用域时,依赖关系解析会发生令人困惑的事情,但我认为在您的情况下这应该不是问题。

有同样的问题,我需要两个作用域的原因是相同的依赖项是阶段集成测试我使用 jetty-plugin 来运行 REST 服务,并在 jetty 运行时进行一些 JUnit 测试,但我为 jboss 编译我的包,因为我已经有"resteasy-cdi",而不是没有 jetty servlet 容器......我还没有找到解决方案。

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

请在 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 部分中的依赖项。由于它们被替换,因此具有导入范围的依赖项实际上并不参与限制依赖项的传递性。

相关内容

  • 没有找到相关文章

最新更新