Java 使用Gradle防止第三方库位于编译类路径上

Java 使用Gradle防止第三方库位于编译类路径上,java,dependencies,gradle,dependency-management,Java,Dependencies,Gradle,Dependency Management,我有一个多项目的渐变构建。我有子项目-A,这取决于子项目-BSub-Project-B在编译时依赖于SLF4J。我不希望子项目-A能够针对任何SLF4J库进行编译,但在运行时我确实希望子项目-B代码能够运行 我想我可以做的是将编译时依赖项添加到Sub-Project-B中,然后添加: configurations { compile.exclude group: 'org.slf4j' } 到Sub-Project-A。这确实阻止了任何代码针对slf4j API进行编译,但也阻止了slf4

我有一个多项目的渐变构建。我有
子项目-A
,这取决于
子项目-B
Sub-Project-B
在编译时依赖于
SLF4J
。我不希望
子项目-A
能够针对任何
SLF4J
库进行编译,但在运行时我确实希望
子项目-B
代码能够运行

我想我可以做的是将编译时依赖项添加到Sub-Project-B中,然后添加:

configurations {
  compile.exclude group: 'org.slf4j'
}
到Sub-Project-A。这确实阻止了任何代码针对slf4j API进行编译,但也阻止了slf4j库位于Sub-Project-A运行时,因此只要访问Sub-Project-B中的代码,我就会得到ClassNotFoundException


由于这一直很难得到工作,我想我一定是做错了什么,但这并不是一个不合理的设置。我只希望构建中的一个子项目能够在编译时访问第三方库。

在子项目B上定义依赖项时,您可能应该排除slf4j依赖项,然后将slf4j依赖项添加到运行时配置中:

dependencies {
    compile(project(':Sub-Project-B')) {
        exclude group: 'org.slf4j'
    }
    runtime 'org.slf4j:...:...'
}
dependencies {
    compile(project(':A')) {
        exclude group: 'org.slf4j'
    }
    runtime project(':A')
}

我认为您需要排除它,然后重新包含它。我看不出一步就能做到这一点

作为对的轻微修改,您可以在a的运行时配置中重新包含B的全部依赖项:

dependencies {
    compile(project(':Sub-Project-B')) {
        exclude group: 'org.slf4j'
    }
    runtime 'org.slf4j:...:...'
}
dependencies {
    compile(project(':A')) {
        exclude group: 'org.slf4j'
    }
    runtime project(':A')
}

这就少了一点重复性。

这非常有效,但我现在发现,我配置的一系列其他依赖项也最终引入了slf4j,所以这个解决方案无论如何都不起作用。将此标记为正确的解决方案,因为在我的有限案例中,我概述了我认为这绝对是处理此问题的最佳方法。谢谢