Gradle java库:api,但可编译

Gradle java库:api,但可编译,java,gradle,dependencies,war,Java,Gradle,Dependencies,War,根项目:创建一场战争 次级项目foo apply plugin: 'java-libarary dependencies { compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' } apply plugin: 'java-libarary dependencies { compileOnlyApi group: 'javax.servlet', name: 'javax.

根项目:创建一场战争

次级项目foo

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

dependencies {
    compile project(':foo')
}
子项目栏

apply plugin: 'java-libarary

dependencies {
    compile project(':foo')
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}
有没有办法不在javax.servlet-api上添加两次相同的依赖项? ProjectFoo的一些可编译依赖项需要添加到ProjectBar中,但它不应该出现在战争中。需要如下配置:

apiCompileOnly

如果您需要类似于
apiCompileOnly
的配置,则不会阻止您创建一个

configurations {
    apiCompileOnly
}

或者您可以将其从
战争中排除:

war {
    rootSpec.exclude('**/javax.servlet-api-*.jar')
}
您可以通过根
build.gradle

subprojects {
    dependencies {
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
    }
}
正如你所说的

ProjectFoo的一些可编译依赖项需要添加到ProjectBar中,但它不应该出现在战争中

那么在这种情况下,
子项目
闭包就不再那么方便了。 您可以将所有子项目共有的依赖项添加到其中,并将特定的依赖项添加到特定的项目中,但请记住有关传递的信息,因为如果您不这样禁用,您的
项目
依赖项将带来它们的传递信息:

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

或者,您可以搜索您感兴趣的项目,并添加您需要的内容,如根项目
build.gradle中的另一个答案中所建议的
@ToYonos

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


任何想让库或模块的使用者使用compileOnly依赖项(无需在使用者模块中重新声明)的人,现在都有compileOnlyApi:

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

次级项目foo

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

dependencies {
    compile project(':foo')
}
子项目栏现在在编译时可以访问servlet类,因为它导入了项目foo

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

dependencies {
    compile project(':foo')
}

java库和war插件中应支持apiCompileOnly以自动传播依赖项,但从运行时(如war)中排除。@eastwater我不确定你的意思,我找不到有关
apiCompileOnly
配置的任何信息。您在哪里找到了有关此的信息?它不存在,但此配置很有用。