Gradle java-library:api但是compileOnly

时间:2017-06-30 01:35:23

标签: java gradle dependencies war

rootProject:创建战争

子项目foo

apply plugin: 'java-libarary
dependencies {
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

子项目栏

apply plugin: 'java-libarary

dependencies {
    compile project(':foo')
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

有没有办法不在javax.servlet-api上添加两次相同的依赖项? 项目foo的一些compileOnly依赖项需要添加到项目栏中,但它不应该在战争中。需要像以下配置:

apiCompileOnly

3 个答案:

答案 0 :(得分:0)

如果您需要apiCompileOnly之类的配置,则无法阻止您创建一个。

configurations {
    apiCompileOnly
}

configurations.create('apiCompileOnly')

或者您可以将其从war

中排除
war {
    rootSpec.exclude('**/javax.servlet-api-*.jar')
}

您可以通过subprojects

中的build.gradle在每个子项目中包含依赖项
subprojects {
    dependencies {
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
    }
}

你也说过

  

项目foo的一些compileOnly依赖项需要添加到项目栏中,但它不应该在战争中。

然后在这种情况下,subprojects闭包不再那么方便了。 你可以添加那里所有子项目共有的依赖项,以及特定项目中的特定项目,但请记住传递,因为如果不这样禁用它,project依赖项将带来传递:

compile (project(':foo')){transitive=false}

或者您可以搜索您感兴趣的项目,并在其他答案中添加您需要的内容@ToYonos sugested

答案 1 :(得分:0)

在根项目build.gradle中添加:

apply plugin: 'java-libarary'
subprojects {
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

或者

apply plugin: 'java-libarary'
subprojects.findAll { ['foo', 'bar'].contains(it.name) }.each {
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

答案 2 :(得分:0)

任何人都在寻找一种方法来允许您的库或模块的使用者使用 compileOnly 依赖项(而不必在消费模块中重新声明它们),现在有 compileOnlyApi:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph

这允许将库的依赖放在使用它的任何模块的编译时类路径上:

子项目 foo

apply plugin: 'java-libarary
dependencies {
    compileOnlyApi group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

子项目栏现在可以在编译时访问 servlet 类,因为它导入项目 foo

apply plugin: 'java-libarary

dependencies {
    compile project(':foo')
}