我想在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'.
在这种情况下声明依赖范围的正确方法是什么?
答案 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/此链接帮助我添加了正确的范围。这是范围映射和需要依赖项的阶段的摘要。
因此,当我在测试和运行时需要依赖项时,我将范围指定为“运行时”,并且按预期运行。