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

时间:2014-10-13 05:00:59

标签: java gradle war

假设我们有一个多项目构建。最终整个项目被捆绑成一场战争。我们知道Web容器会提供一些实用工具罐,比如一些与日志相关的jar,所以我们想要使用provided种范围。 war插件提供了良好的providedCompileprovidedRuntime配置。但是,我们只想在创建战争的子项目中使用war插件。所以,问题是,我们如何在其他子项目中使用providedCompileprovidedRuntime之类的东西?理想情况下,我们希望将该范围应用于subprojects {}闭包中的日志记录jar。

更新
我的情况如下所示。

在根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
...

这些依赖项不仅用于war子项目,而且应该在战争中排除它们。因此,我需要一些机制来实现这一目标。

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

2 个答案:

答案 0 :(得分:0)

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

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

configurations {
    provided
}

sourceSets.test {
    runtimeClasspath += configurations.provided
}

这种方法的缺点是IDE,例如IntelliJ IDEA,可能不了解自定义配置,因此无法正确提取依赖关系。 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 )
    }
}

答案 1 :(得分:0)