Опубликовать несколько модулей Gradle в одном артефакте Maven

#maven #gradle #maven-publish

#maven #gradle #maven-опубликовать

Вопрос:

У меня есть проект библиотеки, который состоит из двух разных API ( a и b ), которые должны работать с одним core и base тем же кодом и. core скрыт от пользователя a или b поэтому существует implementation зависимость core . Но base предоставляется пользователю a или b , таким образом, существует api зависимость base .

Структура модуля

Все это нормально, пока вы остаетесь в мире Gradle. Но это становится сложнее, когда вы публикуете a и b maven-publish используете плагин Gradle. Он создает артефакт каждого из модулей отдельно и (правильно) описывает зависимости между ними. Но я не хочу выставлять core и base отдельно. Вместо этого я хотел бы объединить их в один артефакт для a и b для каждого, где типы в core остаются внутренними, а те, в base , отображаются.

Есть ли способ сделать это с maven-publish помощью?

Ответ №1:

Вы захотите создать fat / uber JAR. Существует множество руководств, но общий подход заключается в использовании плагина Shadow: https://imperceptiblethoughts.com/shadow /

Вы бы настроили теневой плагин так core , base чтобы он был встроен / включен в a него и b был встроен / включен без необходимости их публикации.

Комментарии:

1. спасибо за подсказку, определенно правильное направление! однако я не нашел способа скрыться core от пользователя библиотеки. единственной общедоступной для пользователя должна быть api и common . я пробовал уже давно и не нашел способа добиться этого с помощью плагина shadow. знаете ли вы способ сделать это? например, как мы могли бы установить видимость всех классов в core internal во время затенения?

Ответ №2:

Существует 4 проекта

a (api) — зависит от base , core
b (api) — зависит от base , core
core (lib) — зависит от base
base (api) — нет

предполагая, что все они создаются с java-library помощью плагина.

Если я правильно понял ваш вопрос — вы хотите, чтобы конечные пользователи видели api, a, b, base но нет core — я предполагаю, что это применимо для разработки / компиляции;

если приведенное выше верно — это связано не с maven-publish; а скорее с объявлением зависимостей

пожалуйста, смотрите https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation

в a и b build.gradle

 api base
implementation core
  

в core build.gradle

 api base