2011-05-09 61 views
31

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

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

由于提前

+0

你使用surefire插件来运行单元测试吗? – 2011-05-10 14:45:06

+0

请澄清你是否参考阶段或不同的版本与“编译”和“去运行测试”(请参阅​​我的答案和下面的评论)。 – Jan 2011-05-12 07:44:11

回答

28

maven documentation

提供这很像编译,而是指你所期望的JDK 或容器,以提供在运行时的依赖。例如,当 构建Java企业版的Web应用程序时,您将 将Servlet API和相关Java EE API的依赖性设置为 ,因为Web容器提供了这些类。 此 范围仅适用于编译和测试类路径,并且 不可传递。

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

+0

这是正确的答案,至少在我的用例中。 @Steve,你应该把它标记为接受:) – 2012-11-16 21:10:12

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但也有其他方法,fe默认激活 - 看看here

+0

我认为OP想要在_same_构建中提供并测试范围。 – 2011-05-11 08:19:33

+0

@安德鲁斯宾塞:我认为公正的用例不同,除了他指的是同一个构建中的测试。这当然会是另一回事...... – Jan 2011-05-12 07:42:59

+0

这不是Maven的方式!依赖关系应该是稳定的,哪些配置文件是主动的! – 2013-08-14 06:30:45

3

尝试声明两次依赖关系,每个作用域一次。适用于Maven 2.2.1。

令人困惑的事情发生在依赖解决方案,当相同的工件在依赖关系树中两次与不同的范围,但我不认为它应该是一个问题在你的情况。

+2

在Maven 3.0.5中,这个解决方案导致'[警告]强烈建议解决这些问题,因为它们威胁到构建的稳定性。因此,未来的Maven版本可能不再支持构建此类格式不正确的项目。“ – SebastianH 2014-02-18 16:19:18

0

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

2

有同样的问题,为什么我需要两个范围相同的依赖项是阶段集成测试我使用jetty插件运行休息服务,并做一些JUnit测试,而码头正在运行,但我编译我的软件包作为jboss,我已经有了“resteasy-cdi”,比jetty servlet容器缺少了...我还没有找到解决方案。

0

请找出范围的确切含义在Maven的

我refered到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提供。工件始终可用,并且不会在存储库中查找。导入(仅在Maven 2.0.9或更高版本中可用): - 此范围仅用于部分中的类型pom依赖项。它表明指定的POM应该替换为该POM部分中的依赖关系。由于它们被替换,因此具有导入范围的依赖关系实际上并不参与限制依赖关系的传递性。