我有一个项目,我想使用提供的编译,以避免拉它的库。但是,这阻止了我拉入我需要的另一个项目的库。文档说:如果您不想要这种传递行为,只需声明您提供的依赖项,但它没有举例说明如何执行此操作。
这基本上是我的依赖关系的样子:
dependencies {
compile(project(':common'))
providedCompile(project(':projA')) // <-- also depends on :common
}
我的war文件正确排除了projA的所有传递库,但是我需要对common.jar说明这一点,我无法弄清楚如何实现这一点。但文档似乎表明它是可能的......
编辑:这是一个似乎有用的hacky配置。 “projA”的行组合给了我projA.jar作为依赖,但不是它的孩子。由于“common”是编译依赖项,但“projA”仅在运行时被视为提供,因为 compile 时间依赖性,我仍然得到common.jar。我不确定它应该以这种方式工作,但它会产生我需要的战争。
dependencies {
compile(project(':projA')) { transitive = false }
providedRuntime(project(':projA')) { transitive = false }
compile(project(':common'))
}
答案 0 :(得分:2)
如果您不想要这种传递行为,只需声明您提供的依赖项
即可
这意味着如果您不希望声明projA的所有依赖项,则需要逐个列出它们。
来自Gradle 1.8用户指南'26 .4。依赖管理'
War插件添加了两个依赖配置:providedCompile和 providedRuntime。这些配置的范围与 相应的编译和运行时配置,除了它们 没有添加到WAR存档中。重要的是要注意那些 提供的配置可以传递。 假设您将commons-httpclient:commons-httpclient:3.0添加到任何 提供的配置。这种依赖关系依赖于 公地编解码器。这意味着httpclient和commons-codec都不是 添加到WAR中,即使commons-codec是显式依赖项 您的编译配置。如果你不想要这个传递 行为,只需声明您提供的依赖项,如 公地HttpClient的:公地的HttpClient:3.0@jar
答案 1 :(得分:1)
还有另一个更好的解决方案似乎正在起作用。使用 error TS2531: Object is possibly 'null'.
,您可以排除在编译期间会丢失的所有传递依赖项,并且必须手动声明所有传递依赖项(再次按规定提供),如果它们还包含所需的库,这将很麻烦。
因此,对于providerCompile语句,不仅要排除所有传递性依赖项,还要排除您想通过单独的compile语句包含在战争中的依赖项。
真实示例,其中我需要war文件中包含的commons编解码器,但也将其放置在keycloak-services和keycloak-model-jpa中:
transitive=false