为Maven依赖声明多个范围的正确方法?

时间:2013-01-30 10:21:38

标签: maven maven-3

我想在test范围内使用依赖项(以便在运行单元测试时它位于类路径中),并且在runtime范围内(以便我可以包含它)在WAR / EAR /其他打包中进行部署,但不影响依赖工件的传递依赖性查找。)

现实生活中的例子是SLF4J的实现JAR(例如Logback)。我希望它在运行测试时存在于类路径中,并且我希望它包含在我的WAR / EAR中,但我不希望项目取决于我的项目将其包含在传递依赖项查找中。

我尝试使用<scope>test,runtime</scope>,但Maven 3会发出警告:

[WARNING] 'dependencies.dependency.scope' for org.slf4j:jcl-over-slf4j:jar 
must be one of [provided, compile, runtime, test, system] but is 'test,runtime'. 

在这种情况下声明依赖范围的正确方法是什么?

4 个答案:

答案 0 :(得分:34)

运行时作用域还使测试类路径上的工件可用。只需使用运行时。 (参见Maven documentation。)

为了避免依赖性地解决依赖关系,请使用<optional>true</optional>使其optional

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback</artifactId>
  <version>0.5</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>

答案 1 :(得分:12)

您只能为每个<scope/>代码定义一个范围值。

我担心仅仅使用示波器无法实现您想要做的事情。如果您定义范围test,它将仅在测试期间可用;如果您定义了提供的范围,那么这意味着您希望在编译和测试期间解析和使用项目的依赖关系,但它不会包含在WAR文件中。不管怎样,这不是你想要的。

因此,我建议你看看maven-assembly-plugin,你可以用它来实现它,但它仍然需要一些游戏。

答案 2 :(得分:7)

声明scope runtime的依赖关系可确保在编译期间库不可用。

将依赖关系声明为optional会导致依赖关系解析过程中断;取决于您的库的项目将需要明确地包含依赖项本身。

所以声明这个的正确方法是:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.13</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>

答案 3 :(得分:0)

不确定这是否仍然对仍在寻找一种简单方法的人有所帮助-https://howtodoinjava.com/maven/maven-dependency-scopes/此链接帮助我添加了正确的范围。这是范围映射和需要依赖项的阶段的摘要。

  1. 编译-构建,测试和运行
  2. 提供-构建和测试
  3. 运行时-测试并运行
  4. 测试-编译和测试

因此,当我在测试和运行时需要依赖项时,我将范围指定为“运行时”,并且按预期运行。