2

我有一个项目,我想使用 providedCompile 来避免拉取它的库。但是,这会阻止我引入我确实需要的另一个项目的库。文档说:如果您不想要这种传递行为,只需声明您提供的依赖项,但它没有给出如何执行此操作的示例。

这基本上是我的依赖项的样子:

dependencies {
    compile(project(':common'))
    providedCompile(project(':projA')) // <-- also depends on :common
}

我的战争文件正确地排除了 projA 中的所有传递库,但我需要为 common.jar 胜过它,我不知道如何做到这一点。但文档似乎表明这是可能的......

编辑:这是一个似乎有效的 hacky 配置。“projA”的行组合给了我 projA.jar 作为依赖项,但不是它的子项。而且由于“common”是一个编译依赖,但“projA”只被认为是在运行时提供的,由于编译时依赖,我仍然得到了 common.jar。我不确定它应该以这种方式工作,但它会产生我需要的战争。

dependencies {
    compile(project(':projA')) { transitive = false }
    providedRuntime(project(':projA')) { transitive = false }
    compile(project(':common'))
}
4

2 回答 2

2

如果您不想要这种传递行为,只需声明您提供的依赖项

这意味着,如果您不希望 projA 的所有依赖项都被声明为提供,则需要将它们一一列出。

来自 Gradle 1.8 用户指南 '26.4。依赖管理'

War插件增加了两个依赖配置:providedCompile和providedRuntime。这些配置与各自的编译和运行时配置具有相同的范围,只是它们没有添加到 WAR 存档中。需要注意的是,这些提供的配置是可传递的。假设您将 commons-httpclient:commons-httpclient:3.0 添加到任何提供的配置中。这种依赖关系依赖于 commons-codec。这意味着 httpclient 和 commons-codec 都不会添加到您的 WAR 中,即使 commons-codec 是您的编译配置的显式依赖项。如果您不想要这种传递行为,只需声明您提供的依赖项,例如 commons-httpclient:commons-httpclient:3.0@jar。

于 2013-11-08T22:49:48.667 回答
2

似乎还有另一种更好的解决方案。随着transitive=false您排除所有在编译期间丢失的传递依赖项,您必须手动声明所有它们(再次按照提供的方式),如果它们还包含您想要的库,这很痛苦。

因此,对于 providedCompile 语句,不排除所有传递依赖项,而只排除您希望通过单独的编译语句包含在 war 中的依赖项。

我需要包含在 war 文件中的 commons-codec 的真实示例,但它也放置在 keycloak-services 和 keycloak-model-jpa 中:

providedCompile         ("org.keycloak:keycloak-model-jpa:6.0.1") {
    exclude group: 'commons-codec', module: 'commons-codec'
}
providedCompile         ("org.keycloak:keycloak-services:6.0.1") {
    exclude group: 'commons-codec', module: 'commons-codec'
}
providedCompile         "org.keycloak:keycloak-core:6.0.1"
providedCompile         "org.keycloak:keycloak-server-spi:6.0.1"
providedCompile         "org.keycloak:keycloak-server-spi-private:6.0.1"
compile                 "commons-codec:commons-codec:1.10"
于 2020-01-08T10:26:23.937 回答