【问题标题】:Gradle trump providedCompile's exclusion?Gradle 王牌提供编译的排除?
【发布时间】:2013-11-21 02:27:22
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: gradle


    【解决方案1】:

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

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

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

    War 插件增加了两个依赖配置:providedCompile 和 提供运行时。这些配置与 各自的编译和运行时配置,除了它们是 未添加到 WAR 档案中。需要注意的是,那些 提供的配置可传递地工作。 假设您将 commons-httpclient:commons-httpclient:3.0 添加到任何 提供的配置。这个依赖依赖于 公共编解码器。这意味着 httpclient 和 commons-codec 都不是 添加到您的 WAR,即使 commons-codec 是显式依赖项 你的编译配置。如果你不想要这个传递 行为,只需声明您提供的依赖项,例如 commons-httpclient:commons-httpclient:3.0@jar.

    【讨论】:

    • 呃,太糟糕了。有几十个罐子,我必须一次声明一个。
    • 您可以尝试从 providedCompile 声明 providedCompile(project(':projA')){ exclude project(':common') } 中排除 common,但我不知道它是否有效。
    • @ChrisKessel 你试过了吗?
    • 是和不是。必须一次排除一个 subjar 的想法很痛苦,而且我不想每次“projA”添加一个新 jar 时都更新我的项目。所以我破解了它,发现了一些有用的东西。我已经用 hack/solution 更新了原始问题。
    【解决方案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"
    

    【讨论】:

    • IMO 这应该在文档中提到!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2013-03-14
    相关资源
    最近更新 更多