Недавно появилась новость о том, что
JCenter скоро будет закрыт и как нам дальше жить там не
сказано надо бы переезжать куда-то ещё. Лично для меня главным
кандидатом стал MavenCentral, поскольку я уже давно там публикуюсь,
хотя последний год привык делать это через Bintray. В этой заметке
будет краткая информация о подводных, с которыми я встретился и как
пришлось поменять свои скрипты публикции.
В ЭТОЙ СТАТЬЕ НЕТ ИНФОРМАЦИИ О ПУБЛИКАЦИИ НАТИВНХ ТАРГЕТОВ. И тем не менее, надеюсь, информация в статье будет вам полезна.
Наверно, уже писали
Действительно, есть несколько статей на эту тему (2019 года и 2021), но на данный момент я не видел ни одной полноценной статьи с информацией о скриптах публикации (наверное, просто не туда смотрел). Большую часть информации можно взять из статьи (регистрация в Sonatype, регистрация домена, создание GPG ключа и его назначение). Если вкратце, вот вам универсальный скрипт публикации мультиплатформенного проекта:
apply plugin: 'maven-publish'apply plugin: 'signing'task javadocsJar(type: Jar) { // нужно, чтобы javadocs точно были включены в публикацию classifier = 'javadoc'}publishing { publications.all { artifact javadocsJar pom { description = "Ваше описание проекта" name = "${project.name}" url = "https://github.com/Owner/Project" // здесь обычная ссылка на проект, может быть и не github scm { developerConnection = "scm:git:[fetch=]/*ВАША ССЛКА НА .git файл*/[push=]/*Повторить предыдущую ссылку*/" url = "/*Ещё раз повторить предыдущую ссылку*/" } developers { developer { id = "ID разработчика" name = "Имя разработчика" email = "email разработчика" } } licenses { license { name = "Имя лицензии" url = "Ссылка на LICENSE файл" } } } repositories { // тут только Maven Central maven { name = "sonatype" url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") credentials { username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER') password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') } } } }}signing { useGpgCmd() sign publishing.publications}
Вы можете посмотреть на пример этого скрипта тут. Во время переезде с JCenter я встретился со следующими ошибками:
-
maven url должен присваиваться именно
uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
-
Подпись должна производиться именно для publishing.publications (у меня раньше подписывась каждая публикация отдельно, отчего Java таргеты (включая Android) не получали свои подписи)
Публикация
Перед публикацией не забудьте предоставить в gradle переменные
SONATYPE_USER
и SONATYPE_PASSWORD
. Это
можно сделать несколькими способами:
-
Положить их в
~/.gradle/gradle.properties
как обычные переменные -
Экпортировать их перед публикацией в терминале (как это обычно делается в CI билдах)
Можно почитать в статьях в начале о том, как это сделать. Для публикации следует использовать следующий вызов:
$ ./gradlew --no-parallel publishAllPublicationsToSonatypeRepository
--no-parallel
тут используется по той причине, что
если у вас используется параллельное построение проекта (флаг
--parallel
или org.gradle.parallel=true
в
gradle.properties
), то без флага отключения
параллельного построения публикация будет произведена в несколько
репозиторией, что может повлечь за собой невозможность закрыть и
опубликовать релизы (об этом тоже писалось в статьях выше).
Вместо заключения
Публикация библиотеки - штука сложная, а потому я искренне желаю вам удачи на этом поприще. Если есть замечания/дополнения или ещё что-то, что может помочь другим - пишите в комментариях, чтобы я добавил об этом заметку в статью. Всего хорошего :)