使用Gradle防止第三方库在编译类路径上

时间:2013-04-16 20:17:57

标签: java dependencies gradle dependency-management

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

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

configurations {
  compile.exclude group: 'org.slf4j'
}

到子项目-A。这确实可以防止任何代码针对slf4j API进行编译,但它也会阻止slf4j库位于Sub-Project-A运行时,因此只要访问Sub-Project-B的代码,我就会得到ClassNotFoundException。

由于这很难开始工作,我认为我必须做错事,但这并不像是一个不合理的设置。我只希望我的构建中的一个子项目能够在编译时访问第三方库。

2 个答案:

答案 0 :(得分:4)

我认为您需要排除它然后重新包含它。我无法通过一个步骤看到任何方法。

作为erdi's solution的略微修改,您可以在A的运行时配置中重新包含B的所有依赖项:

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

重复性稍差。

答案 1 :(得分:3)

在定义Sub-Project-B的依赖关系时,您应该排除slf4j依赖关系,然后将slf4j依赖关系添加到运行时配置中:

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