Хостинг репозитория Maven на github

У меня есть вилка небольшой библиотеки с открытым исходным кодом, над которой я работаю на github. Я хотел бы сделать его доступным для других разработчиков через maven, но я не хочу запускать свой собственный сервер Nexus, и потому что это вилка, я не могу легко развернуть его на oss.sonatype.org.

Что я хотел бы сделать, так это развернуть его в github, чтобы другие могли получить к нему доступ с помощью maven. Какой лучший способ сделать это?

Ответ 1

Лучшее решение, которое я смог найти, состоит из следующих шагов:

  • Создайте ветвь с именем mvn-repo для размещения ваших артефактов maven.
  • Используйте github site-maven-plugin, чтобы подтолкнуть ваши артефакты к github.
  • Настройте maven для использования удаленного mvn-repo в качестве репозитория maven.

Существует несколько преимуществ использования этого подхода:

  • Артефакты Maven хранятся отдельно от вашего источника в отдельной ветки с именем mvn-repo, так же как страницы github хранятся в отдельной ветки с именем gh-pages (если вы используете страницы github)
  • В отличие от некоторых других предлагаемых решений, он не конфликтует с вашим gh-pages, если вы их используете.
  • Связывает естественно с целью развертывания, поэтому нет новых команд maven для изучения. Просто используйте mvn deploy, как обычно,

Типичным способом развертывания артефактов в удаленном maven-репо является использование mvn deploy, поэтому давайте исправить этот механизм для этого решения.

Сначала скажите maven, чтобы развернуть артефакты во временное промежуточное место в вашем целевом каталоге. Добавьте это в свой pom.xml:

<distributionManagement>
    <repository>
        <id>internal.repo</id>
        <name>Temporary Staging Repository</name>
        <url>file://${project.build.directory}/mvn-repo</url>
    </repository>
</distributionManagement>

<plugins>
    <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.1</version>
        <configuration>
            <altDeploymentRepository>internal.repo::default::file://${project.build.directory}/mvn-repo</altDeploymentRepository>
        </configuration>
    </plugin>
</plugins>

Теперь попробуйте запустить mvn clean deploy. Вы увидите, что он разместил ваш репозиторий maven до target/mvn-repo. Следующий шаг - загрузить его в GitHub.

Добавьте свои данные аутентификации в ~/.m2/settings.xml, чтобы github site-maven-plugin мог нажать на GitHub:

<!-- NOTE: MAKE SURE THAT settings.xml IS NOT WORLD READABLE! -->
<settings>
  <servers>
    <server>
      <id>github</id>
      <username>YOUR-USERNAME</username>
      <password>YOUR-PASSWORD</password>
    </server>
  </servers>
</settings>

(Как указано, пожалуйста, убедитесь, что chmod 700 settings.xml, чтобы никто не мог прочитать ваш пароль в файле. Если кто-то знает, как сделать приглашение сайта-maven-plugin для пароля вместо того, чтобы требовать его в файле конфигурации, дайте мне знать.)

Затем сообщите GitHub site-maven-plugin о новом настроенном вами сервере, добавив следующее к вашему pom:

<properties>
    <!-- github server corresponds to entry in ~/.m2/settings.xml -->
    <github.global.server>github</github.global.server>
</properties>

Наконец, настройте site-maven-plugin для загрузки с вашего временного промежуточного репо на ветку mvn-repo в Github:

<build>
    <plugins>
        <plugin>
            <groupId>com.github.github</groupId>
            <artifactId>site-maven-plugin</artifactId>
            <version>0.11</version>
            <configuration>
                <message>Maven artifacts for ${project.version}</message>  <!-- git commit message -->
                <noJekyll>true</noJekyll>                                  <!-- disable webpage processing -->
                <outputDirectory>${project.build.directory}/mvn-repo</outputDirectory> <!-- matches distribution management repository url above -->
                <branch>refs/heads/mvn-repo</branch>                       <!-- remote branch name -->
                <includes><include>**/*</include></includes>
                <repositoryName>YOUR-REPOSITORY-NAME</repositoryName>      <!-- github repo name -->
                <repositoryOwner>YOUR-GITHUB-USERNAME</repositoryOwner>    <!-- github username  -->
            </configuration>
            <executions>
              <!-- run site-maven-plugin 'site' target as part of the build normal 'deploy' phase -->
              <execution>
                <goals>
                  <goal>site</goal>
                </goals>
                <phase>deploy</phase>
              </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Разветвление mvn-repo не должно существовать, оно будет создано для вас.

Теперь запустите mvn clean deploy снова. Вы должны увидеть, что maven-deploy-plugin "загружает" файлы в ваш локальный промежуточный репозиторий в целевом каталоге, а затем плагин site-maven-плагин, который передает эти файлы и нажимает их на сервер.

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building DaoCore 1.3-SNAPSHOT
[INFO] ------------------------------------------------------------------------
...
[INFO] --- maven-deploy-plugin:2.5:deploy (default-deploy) @ greendao ---
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.jar (77 KB at 2936.9 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.pom (3 KB at 1402.3 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/maven-metadata.xml (768 B at 150.0 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/maven-metadata.xml (282 B at 91.8 KB/sec)
[INFO] 
[INFO] --- site-maven-plugin:0.7:site (default) @ greendao ---
[INFO] Creating 24 blobs
[INFO] Creating tree with 25 blob entries
[INFO] Creating commit with SHA-1: 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] Updating reference refs/heads/mvn-repo from ab7afb9a228bf33d9e04db39d178f96a7a225593 to 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.595s
[INFO] Finished at: Sun Dec 23 11:23:03 MST 2012
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------

Посетите github.com в своем браузере, выберите ветку mvn-repo и убедитесь, что все ваши двоичные файлы теперь есть.

enter image description here

Поздравляем!

Теперь вы можете развернуть свои артефакты maven для публичного репо плохого человека, просто запустив mvn clean deploy.

Вот еще один шаг, который вы хотите предпринять, чтобы настроить любые помы, которые зависят от вашего поместья, чтобы узнать, где находится ваш репозиторий. Добавьте следующий фрагмент к любому проекту pom, который зависит от вашего проекта:

<repositories>
    <repository>
        <id>YOUR-PROJECT-NAME-mvn-repo</id>
        <url>https://raw.github.com/YOUR-USERNAME/YOUR-PROJECT-NAME/mvn-repo/</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

Теперь любой проект, требующий ваших файлов jar, автоматически загрузит их из вашего репозитория github maven.

Изменить: чтобы избежать проблемы, упомянутой в комментариях ( "Ошибка создания фиксации: неверный запрос. Для" свойств/имени "ниль не является строкой." ), убедитесь, что вы указали имя в своем профиле в github.

Ответ 2

Не используйте GitHub в качестве репозитория Maven.

Изменение: эта опция получает много отрицательных голосов, но без комментариев, почему. Это правильный вариант, независимо от технических возможностей для размещения на GitHub. Хостинг на GitHub неправильный по всем причинам, изложенным ниже, и без комментариев я не могу улучшить ответ, чтобы прояснить ваши проблемы.

Лучший вариант - сотрудничать с оригинальным проектом

Лучший вариант - убедить исходный проект включить ваши изменения и придерживаться оригинала.

Альтернатива - поддерживать свой собственный Fork

Поскольку вы разветкили библиотеку с открытым исходным кодом, и ваш форк также является открытым исходным кодом, вы можете загрузить свой форк в Maven Central (см. Руководство по загрузке артефактов в центральное хранилище), задав ему новый groupId и, возможно, новый artifactId.

Рассматривайте этот вариант только в том случае, если вы хотите сохранить этот форк до тех пор, пока изменения не будут включены в исходный проект, и тогда вам следует отказаться от этого.

Действительно подумайте, является ли вилка правильным вариантом. Прочитайте бесчисленные результаты Google, чтобы узнать, почему бы не раскошелиться

аргументация

Раздувание вашего хранилища банками увеличивает размер загрузки без какой-либо выгоды

Jar - это output вашего проекта, он может быть восстановлен в любое время из его inputs, а репозиторий GitHub должен содержать только inputs.

Не веришь мне? Затем проверьте результаты Google на предмет "не хранить бинарные файлы в git".

GitHub help Работа с большими файлами скажет вам то же самое. По общему признанию, jar невелики, но они больше, чем исходный код, и после того, как jar был создан релизом, у него нет оснований для создания версий - для этого и нужен новый выпуск.

Определение нескольких репозиториев в вашем pom.xml замедляет сборку на количество репозиториев, умноженное на количество артефактов.

Стивен Коннолли говорит:

Если кто-то добавляет ваше репо, он влияет на производительность его сборки, поскольку теперь у него есть другое репо для проверки артефактов на... Это не большая проблема, если вам нужно только добавить одно репо... Но проблема растет, и следующая вещь, которую вы знаете, ваша maven build проверяет 50 репо на каждый артефакт, а время сборки - собака.

Это так! Maven должен проверять каждый артефакт (и его зависимости), определенные в вашем pom.xml, для каждого определенного вами репозитория, поскольку более новая версия может быть доступна в любом из этих репозиториев.

Попробуйте сами, и вы почувствуете боль от медленного телосложения.

Лучшее место для артефактов - в Maven Central, поскольку оно является центральным местом для банок, и это означает, что ваша сборка будет когда-либо проверять только одно место.

Вы можете прочитать больше о репозиториях в документации Maven по введению в репозитории

Ответ 3

Вы можете использовать JitPack (бесплатно для общедоступных репозиториев Git), чтобы представить свой репозиторий GitHub как артефакт Maven. Это очень просто. Ваши пользователи должны добавить это в свой pom.xml:

  1. Добавить репозиторий:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. Добавить зависимость:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

Как уже говорилось в другом месте, идея в том, что JitPack создаст ваш репозиторий GitHub и будет обслуживать банки. Требование - наличие файла сборки и выпуска GitHub.

Приятно то, что вам не нужно обрабатывать развертывание и загрузку. Так как вы не хотите поддерживать свой собственный репозиторий артефактов, он хорошо подходит для ваших нужд.

Ответ 4

Другой альтернативой является использование любого веб-хостинга с поддержкой webdav. Для этого вам, конечно, понадобится некоторое пространство, но его легко настроить и стать хорошей альтернативой запуску полномасштабного сервера nexus.

добавьте это в свой раздел сборки

     <extensions>
        <extension>
        <artifactId>wagon-webdav-jackrabbit</artifactId>
        <groupId>org.apache.maven.wagon</groupId>
        <version>2.2</version>
        </extension>
    </extensions>

Добавьте что-то вроде этого в раздел distributionManagement

<repository>
    <id>release.repo</id>
    <url>dav:http://repo.jillesvangurp.com/releases/</url>
</repository>

Наконец, обязательно настройте доступ к репозиторию в своих настройках. xml

добавить это в раздел серверов.

    <server>
        <id>release.repo</id>
        <username>xxxx</username>
        <password>xxxx</password>
    </server>

и определение в разделе ваших репозиториев

            <repository>
                <id>release.repo</id>
                <url>http://repo.jillesvangurp.com/releases</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>

Наконец, если у вас есть стандартный php-хостинг, вы можете использовать что-то вроде sabredav для добавления возможностей webdav.

Преимущества: у вас есть собственный репозиторий maven Недостатки: у вас нет каких-либо возможностей управления в nexus; вам нужна настройка webdav где-нибудь

Ответ 5

В качестве альтернативы Bintray предоставляет бесплатный хостинг репозиториев maven. Вероятно, это хорошая альтернатива Sonatype OSS и Maven Central, если вы абсолютно не хотите переименовывать groupId. Но, пожалуйста, по крайней мере, приложите усилия, чтобы ваши изменения были интегрированы вверх или переименованы и опубликованы в Central. Это облегчает для других использование вашей вилки.

Ответ 6

Если у вас есть только файл aar или jar, или вы просто не хотите использовать плагины - я создал простой скрипт оболочки. Вы можете добиться того же с ним - опубликовать свои артефакты на Github и использовать его в качестве публичного репозитория Maven.

Ответ 7

С 2019 года вы можете использовать новую функциональность, называемую Реестр пакетов Github. На момент создания этот ответ еще находился в публичной бета-версии.

В основном этот процесс:

  • создать новый персональный токен доступа из настроек github
  • добавить информацию о хранилище и токене в settings.xml
  • развернуть с помощью

    mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token