我的POM中有一个依赖项需要设置为“提供”,所以它不包含在编译中,但它仍然可以在我的项目中引用。当我去运行测试时,我希望相同的依赖项具有“测试”范围,因此我不必手动将jar添加到我的类路径中。有没有办法做到这一点或取得类似的结果?
这背后的推理是我在JBOSS lib目录中提供了一些常见的jar,所以我想使用它们并保持它们的“提供”范围用于构建的战争。但是,当我从命令行运行JUnits时,我想使用存储库中的jar而不是手动将其添加到我的类路径中。
先谢谢
答案 0 :(得分:29)
提供这很像编译,但表示您期望JDK 或者在运行时提供依赖性的容器。例如,何时 您可以为Java Enterprise Edition构建Web应用程序 设置对Servlet API和相关Java EE API的依赖 提供范围是因为Web容器提供了这些类。 :此 scope仅在编译和测试类路径上可用,并且是 不是过渡性的。
我在maven 3.0.3中检查过这个对我有用。有同样的问题,我需要在编译和测试时有一个servlet依赖,但没有编译,因为它附带应用程序服务器分发。
答案 1 :(得分:6)
您可以使用一个配置文件来声明这些依赖项作为测试或提供 - 具体取决于您更方便:
<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。
答案 2 :(得分:3)
尝试两次声明依赖项,每个范围一次。适用于Maven 2.2.1。
依赖项解决时会出现令人困惑的事情,当相同的工件在依赖关系树中使用不同的范围两次时,但我不会认为它应该是您的问题。
答案 3 :(得分:2)
有相同的问题,为什么我需要两个范围用于相同的依赖是在阶段集成测试我使用jetty-plugin进行运行休息服务,并在jetty运行时进行一些JUnit测试,但我编译我的包为jboss因为,我已经有了#34; resteasy-cdi&#34;,而不是缺少jetty servlet容器...我还没有找到解决方案。
答案 4 :(得分:0)
使用maven-surefire-plugin运行junit测试。提供的范围也将使其在测试类路径中可用。
答案 5 :(得分:0)
请在Maven中找到范围的确切含义
我是指Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
依赖范围用于限制依赖项的传递性,还用于影响用于各种构建任务的类路径。
有6个范围:
<强>编译: - 强>
这是默认范围,如果未指定,则使用此范围。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。
<强>提供: - 强>
这很像compile,但表示您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。
<强>运行时: - 强>
此范围表示编译不需要依赖项,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径。
<强>试验: - 强>
此范围表示正常使用应用程序不需要依赖关系,并且仅适用于测试编译和执行阶段。
<强>系统: - 强>
此范围与提供的类似,只是您必须提供明确包含它的JAR。工件始终可用,并且不会在存储库中查找。 import(仅在Maven 2.0.9或更高版本中可用): - 此范围仅用于节中pom类型的依赖项。它表示应该用POM的部分中的依赖项替换指定的POM。由于它们被替换,具有导入范围的依赖性实际上并不参与限制依赖的传递性。