POM中的多个依赖范围

时间:2011-05-09 18:46:55

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

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

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

先谢谢

6 个答案:

答案 0 :(得分:29)

来自maven documentation

  

提供这很像编译,但表示您期望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。由于它们被替换,具有导入范围的依赖性实际上并不参与限制依赖的传递性。