#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