Gradle trump提供了Compile的排除?

时间:2013-11-08 22:46:15

标签: gradle

我有一个项目,我想使用提供的编译,以避免拉它的库。但是,这阻止了我拉入我需要的另一个项目的库。文档说:如果您不想要这种传递行为,只需声明您提供的依赖项,但它没有举例说明如何执行此操作。

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

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'))
}

2 个答案:

答案 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