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


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

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

6 287

6 ответов:

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

  1. создать ветку под названием mvn-repo для размещения артефактов maven.
  2. используйте github site-maven-plugin чтобы подтолкнуть ваши артефакты к 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>

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

теперь бегите mvn clean deploy снова. Вы должны увидеть, что Maven-deploy-plugin "загружает" файлы в локальный промежуточный репозиторий в целевом каталоге, а затем сайт-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: чтобы избежать проблемы, упомянутой в комментариях ('ошибка создания фиксации: недопустимый запрос. Для' свойства/имя', 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.