POM中的多个依赖范围

Ste*_*eve 34 maven-2 dependency-management pom.xml maven

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

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

提前致谢

fyr*_*fyr 29

maven文档:

提供这很像compile,但表示您希望JDK或容器在运行时提供依赖关系.例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类.此范围仅在编译和测试类路径中可用,并且不可传递.

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


Jan*_*Jan 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>
Run Code Online (Sandbox Code Playgroud)

通过设置属性env激活这些配置文件,但还有其他方法,默认激活 - 看看这里.

  • @MartinHöller:我明白你的观点,但为什么依赖关系部分包含在配置文件中呢?当您需要其他依赖项时可能存在用例 - 这可能不会影响您部署的构建结果. (3认同)