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

jja*_*man 2 java dependencies dependency-management gradle

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

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

configurations {
  compile.exclude group: 'org.slf4j'
}
Run Code Online (Sandbox Code Playgroud)

到子项目-A。这确实阻止了任何代码针对 slf4j API 进行编译,但它也阻止了 slf4j 库出现在 Sub-Project-A 运行时上,因此一旦Sub-Project-B访问代码,我就会收到 ClassNotFoundException。

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

Tom*_*son 5

我认为您需要排除它,然后重新包含它。我看不到任何方法可以一步完成此操作。

作为对erdi 解决方案的轻微修改,您可以将 B 的整个依赖项重新包含在 A 的运行时配置中:

dependencies {
    compile(project(':A')) {
        exclude group: 'org.slf4j'
    }
    runtime project(':A')
}
Run Code Online (Sandbox Code Playgroud)

这样就少了一些重复。