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