正确的方式来声明多个范围的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>
- 使用project.parent.version作为Maven 3中模块的版本的警告
- Maven无法解决依赖关系,工件无法parsing
- IntelliJ新build项目 – maven原型列表为空
- 无法执行目标org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile(default-compile)
- MavenArchiver.getManifest()中的m2e错误
- Intellij的想法无法解决maven中的任何问题
- Maven Cobertura插件不会生成coverage.xml
- 自动项目版本在连续交付时的Maven方式是什么?
- 你如何有效地处理maven-3时间戳快照?