繁体   English   中英

如何在gradle的子项目{}中启用提供的范围?

[英]How to enable provided scope in subproject{} in gradle?

假设我们有一个多项目构建。 最终,整个项目捆绑在一起。 我们知道Web容器将提供一些实用程序jar,例如与日志记录相关的jar,因此我们想使用provided的范围。 war插件提供了不错的providedCompileprovidedRuntime配置。 但是,我们只想在创建war的子项目中使用war插件。 所以,问题是,我们如何能使用类似providedCompileprovidedRuntime在其他分项目? 理想情况下,我们希望将该范围应用于subprojects {}闭包中的日志记录jar。

更新
我的情况如下。

在root build.gradle ,我有类似以下内容:

subprojects {
    apply plugin: 'groovy'
    apply plugin: 'maven'

    dependencies {
        compile 'org.slf4j:slf4j-api:1.7.7'                // already provided by the servlet container
        compile 'javax.servlet:javax.servlet-api:3.1.0'    // already provided by the servlet container
        runtime 'ch.qos.logback:logback-classic:1.1.2'     // already provided by the servlet container
        runtime 'ch.qos.logback:logback-core:1.1.2'        // already provided by the servlet container
...

这些依赖关系不仅由战争子项目使用,而且应在战争中排除。 因此,我需要某种机制来实现这一目标。

顺便说一句,我已经找到了解决方案。

有两种方法可以实现所provided范围。

选项1
创建一个自定义配置provided 例如:

configurations {
    provided
}

sourceSets.test {
    runtimeClasspath += configurations.provided
}

这种方法的缺点是,例如IntelliJ IDEA等IDE可能不了解自定义配置,因此无法正确提取依赖关系。 IntelliJ IDEA发生在我身上。

选项2
使用预定义的compileruntime配置。 然后,在war子项目的build.gradle中,过滤掉您选择的jar。 例如,

war {
    Set exclusions = ['slf4j-api-1.7.7.jar', 'javax.servlet-api-3.1.0.jar',
                      'logback-classic-1.1.2.jar', 'logback-core-1.1.2.jar'] as Set
    classpath = classpath.filter { file ->
        !exclusions.contains( file.name )
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM