70

我有一个要在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

4 回答 4

43

运行时范围还使工件在测试类路径上可用。只需使用运行时。(请参阅 Maven文档。)

为了避免依赖传递地解决,还可以通过以下方式使其成为可选<optional>true</optional>

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback</artifactId>
  <version>0.5</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>
于 2013-04-10T22:13:36.417 回答
13

<scope/>每个标签只能定义一个范围值。

恐怕您想做的事情不能仅通过使用范围来实现。如果您定义 的范围test,则它仅在测试期间可用;如果您定义提供的范围,这意味着您希望项目的依赖项在编译和测试期间都得到解决和使用,但它不会包含在您的 WAR 文件中。无论哪种方式,这都不是你想要的。

因此,我建议您查看maven-assembly-plugin,您可以使用它来实现它,但它仍然需要一些尝试。

于 2013-01-30T10:55:08.723 回答
8

声明范围为的依赖项runtime可确保库在编译期间不可用。

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

因此,声明这一点的正确方法是:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.13</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>
于 2015-12-21T16:06:40.773 回答
5

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

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

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

于 2020-12-17T06:56:58.813 回答