【问题标题】:Publish multiple Gradle modules in one Maven artifact在一个 Maven 工件中发布多个 Gradle 模块
【发布时间】:2021-02-19 12:05:01
【问题描述】:

我有一个库项目,它由两个不同的 API(ab)组成,它们应该在相同的 corebase 代码上运行。 coreab 的用户隐藏,因此implementation 依赖于core。但是base 暴露给ab 的用户,所以apibase 的依赖。

只要您留在 Gradle 世界中,这一切都很好。但是,当您使用 maven-publish Gradle 插件发布 ab 时,情况会变得更加复杂。它分别创建每个模块的工件并(正确地)概述它们之间的依赖关系。但我不想分别公开corebase。相反,我想将它们捆绑到一个工件中,分别用于ab,其中core 中的类型保留在内部,而base 中的类型是公开的。

有没有办法用maven-publish 做到这一点?

【问题讨论】:

    标签: maven gradle maven-publish


    【解决方案1】:

    有4个项目

    a (api) - 依赖于basecore
    b (api) - 依赖于basecore
    core (lib) - 依赖于base
    base (api) - 没有

    假设所有都是使用java-library 插件构建的。

    如果我的问题是正确的 - 你希望最终用户看到 api 的 -a, b, base 而不是 core - 我假设这适用于 DEV / Compile-time;

    如果上面是正确的 - 这不是 maven-publish;而是依赖声明

    请看https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation

    ab build.gradle 中

    api base
    implementation core
    

    corebuild.gradle

    api base
    
    

    【讨论】:

      【解决方案2】:

      您需要创建一个胖/超级 JAR。那里有很多教程,但一种常见的方法是使用 Shadow 插件:https://imperceptiblethoughts.com/shadow/

      您可以将 Shadow 插件配置为将 corebase 嵌入/包含在 ab 中,而无需发布它们。

      【讨论】:

      • 感谢您的提示,绝对是正确的方向!不过,我发现无法向图书馆用户隐藏core。唯一对用户公开的应该是apicommon。我现在尝试了很长时间,发现无法使用影子插件来实现这一点。你知道这样做的方法吗?例如我们如何在阴影期间将core 中所有类的可见性设置为internal
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2014-01-17
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      相关资源
      最近更新 更多