正确的方式来声明多个范围的Maven依赖?

例如,我有一个依赖关系,我想在test范围中使用(以便它在类path中,当我运行unit testing时)以及runtime范围内(这样我可以在WAR / EAR / other包装中包含部署,但不影响从属工件的传递依赖查找)。

一个真实的例子是SLF4J的实现JAR(例如Logback),当我运行testing时,我希望它存在于classpath中,我希望它被包含在我的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'. 

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

谢谢

运行时作用域也使testing类path上的工件可用。 只要使用运行时。 (请参阅Maven 文档 。

为了避免依赖性传递解决,也可以用<optional>true</optional>使它成为可选的 :

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

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

恐怕你只想用一个示波器就不能实现你想做的事情。 如果你定义了一个test范围,它只能在testing过程中使用。 如果你定义了一个提供的范围,这意味着你会期望在编译和testing期间解决和使用项目的依赖关系,但是它不会被包含在你的WAR文件中。 无论哪种方式,这不是你想要的。

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

使用runtime 范围声明依赖关系可确保在编译期间该库不可用。

声明依赖关系是可选的会导致依赖关系parsing进程的中断; 取决于你的库的项目将需要明确地包括依赖关系本身。

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

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