声明 Maven 依赖的多个作用域的正确方法?

我希望在 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'.

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

52657 次浏览

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

恐怕你想做的事情不能仅仅通过一个范围来实现。如果您定义了 test的作用域,那么它将仅在测试期间可用; 如果您定义了提供的作用域,那将意味着您希望在编译和测试期间解决并使用项目的依赖关系,但是它将不会包含在您的 WAR 文件中。不管怎样,这都不是你想要的。

因此,我建议你看看 Maven-Assembly-plugin,你可以用它来实现它,但它仍然需要一些玩耍。

运行时作用域还使工件在测试类路径上可用

为了避免传递性地解析依赖项,还可以将其设置为 可以选择<optional>true</optional>:

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

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

将依赖项声明为 可以选择会导致依赖项解析过程中断; 依赖于库的项目将需要显式地包含依赖项本身。

因此,正确的声明方式应该是:

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

不确定这是否仍然可以帮助某人谁仍然在寻找一个简单的方法来做到这一点-https://howtodoinjava.com/maven/maven-dependency-scopes/这个链接帮助我添加了正确的范围。下面是范围映射和需要依赖关系的阶段的摘要。

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

因此,当我在测试和运行时期间需要依赖关系时,我将范围设置为“运行时”,它按预期工作。