Размещение репозитория Maven на github

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

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

6 ответов


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

  1. создать ветку под названием mvn-repo для размещения артефактов maven.
  2. используйте github сайт-maven-плагин чтобы подтолкнуть ваши артефакты к github.
  3. настройка 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 чтобы никто не мог прочитать ваш пароль в файле. Если кто-то знает, как сделать запрос site-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's 'site' target as part of the build's 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-plugin фиксирует эти файлы и отправляет их на сервер.

[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, которые зависят от вашего pom, чтобы знать, где находится ваш репозиторий. Добавьте следующий фрагмент в 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.

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


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

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

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

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

альтернатива-поддерживайте свою собственную вилку

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

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

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

мышление

раздувание репозитория с помощью банок увеличивает размер загрузки для no выгода

кувшин-это output вашего проекта, его можно регенерировать в любое время от своего inputs, и Ваше РЕПО GitHub должно содержать только inputs.

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

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

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

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

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

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

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

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

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


можно использовать JitPack чтобы выставить репозиторий 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 освобождать.

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


Другой альтернативой является использование любого веб-хостинга с поддержкой 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 где-то


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


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