github에서 Maven 저장소 호스팅


312

github에서 작업중 인 작은 오픈 소스 라이브러리 포크가 있습니다. maven을 통해 다른 개발자에게 제공하고 싶지만 내 Nexus 서버를 실행하고 싶지 않으며 포크이기 때문에 oss.sonatype.org에 쉽게 배포 할 수 없습니다.

내가하고 싶은 것은 다른 사람들이 maven을 사용하여 액세스 할 수 있도록 github에 배포하는 것입니다. 가장 좋은 방법은 무엇입니까?


5
OSS Sonatype에서 어떤 라이센스 문제가 발생합니까? 내가 직접 사용하기 때문에 궁금합니다.
Archimedes Trajano

5
maven을 통해 GitHub 저장소를 직접 노출 할 수있는 도구가 있습니다. jitpack.io stackoverflow.com/a/28483461/3975649
metrimer

1
Github은 또한 maven을 지원하는 패키지 레지스트리를 발표했습니다. 현재 공개 베타 버전 : github.com/features/package-registry
Kaan

답변:


483

내가 찾은 최고의 솔루션은 다음 단계로 구성됩니다.

  1. mvn-repo메이븐 아티팩트를 호스팅 하는 분기를 작성하십시오 .
  2. github site-maven-plugin 을 사용하여 아티팩트를 github에 푸시하십시오.
  3. 원격 mvn-repo을 maven 저장소로 사용하도록 maven을 구성하십시오 .

이 방법을 사용하면 몇 가지 이점이 있습니다.

  • Maven 아티팩트는 mvn-repogithub 페이지가 gh-pages(github 페이지를 사용하는 경우) 라는 별도의 분기에 유지되는 것처럼 소스라는 별도의 분기에서 소스와 별도로 유지됩니다
  • 다른 제안 된 솔루션과 달리 솔루션을 gh-pages사용하는 경우 충돌하지 않습니다 .
  • deploy 대상과 자연스럽게 연결되므로 배울 새로운 maven 명령이 없습니다. mvn deploy평소처럼 사용하십시오

원격 메이븐 리포지토리에 아티팩트를 배포하는 일반적인 방법은을 사용하는 것이므로이 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.xmlgithub 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 프롬프트를 작성하는 방법을 알고 있다면 알려주십시오.)

그런 site-maven-plugin다음 pom에 다음을 추가하여 방금 구성한 새 서버에 대해 GitHub 에 알리십시오 .

<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지점을 선택한 다음 모든 바이너리가 있는지 확인하십시오.

여기에 이미지 설명을 입력하십시오

축하합니다!

이제을 실행하여 빈곤 한 사람의 공개 저장소에 maven 아티팩트를 배치 할 수 있습니다 mvn clean deploy.

수행해야 할 단계가 하나 더 있습니다. 즉, 리포지토리의 위치를 ​​알도록 pom에 의존하는 모든 폼을 구성하는 것입니다. 프로젝트에 의존하는 프로젝트의 pom에 다음 코드를 추가하십시오.

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

이제 jar 파일이 필요한 프로젝트는 github maven 저장소에서 자동으로 다운로드합니다.

편집 : 주석에 언급 된 문제를 피하려면 ( '커밋 생성 오류 : 잘못된 요청입니다.'properties / name '의 경우 nil은 문자열이 아닙니다.'), github의 프로파일에 이름을 명시하십시오.


25
또한이 솔루션은 배포 할 때마다 이전 아티팩트를 덮어 씁니다. 이는 스냅 샷 저장소에는 적합하지만 릴리스 된 아티팩트에는 적합하지 않습니다. 해당 동작을 비활성화하려면 <merge>true</merge>site-maven-plugin 구성에서 설정하십시오. 그렇게하면 github에서 mvn-repo 브랜치를 수동으로 만들고 모든 파일을 처음부터 삭제해야한다고 생각합니다.
emmby

13
영리하고 잘 표현 된 +1 내 유일한 비판은 Maven 플러그인 사이트 github.com/github/maven-plugins에 대한 링크를 포함하지 않았다는 것 입니다. Thx Maven 사이트를 github에 게시하는 방법을 찾고있었습니다!
Mark O'Connor

7
이 방법은 github에서 2 단계 인증이 사용될 때 작동하지 않습니다. 여기에 문제가 내 노트를 참조하십시오 github.com/github/maven-plugins/issues/36#issuecomment-31005606
다그

18
다중 모듈 프로젝트 에서이 작업을 수행<altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository> 하려면 maven-deploy-pluginsite-maven-plugin<outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>함께 간단히 사용할 수도 있습니다 . 그러면 모든 아티팩트가 루트 ( "부모") 프로젝트에 배치되고 github의 해당 상위 디렉토리로 푸시됩니다. 그렇지 않으면 각 하위 모듈의 빌드가 이전에 빌드 된 하위 모듈의 빌드를 덮어 씁니다.
sd

7
그것을 작동시키는 두 가지 제안 (적어도 나를 위해) : 현재 버전의 Github 플러그인을 설정하십시오 (지금은 0.11입니다). 또한 모든 사람이 암호 대신 OAUTH 토큰을 사용하도록 제안합니다. '설정-> 응용 프로그램-> 개인 액세스 토큰'에서 생성 할 수 있습니다. 또한이를 통해 토큰을 POM에 인라인하고 토큰을 환경 변수로 저장할 수 있습니다. <github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
Florian Loch

120

GitHub를 Maven 리포지토리로 사용하지 마십시오.

편집 :이 옵션은 많은 다운 투표권을 얻지 만 그 이유에 대한 의견은 없습니다. 이것은 실제로 GitHub에서 호스팅하는 기술적 기능에 관계없이 올바른 옵션입니다. GitHub에서 호스팅하는 것은 아래에 설명 된 모든 이유로 잘못되었으며 의견이 없으면 문제를 명확히하기 위해 답변을 개선 할 수 없습니다.

최상의 옵션-원본 프로젝트와 공동 작업

가장 좋은 방법은 원본 프로젝트에 변경 사항을 포함시키고 원본을 고수하도록 설득하는 것입니다.

대안-나만의 포크 유지

오픈 소스 라이브러리를 포크하고 포크도 오픈 소스이므로 포크를 Maven Central ( 중앙 리포지토리에 아티팩트 업로드 안내서 읽기) 에 업로드 하면 새롭 groupId거나 새로운 것으로 표시 할 수 artifactId있습니다.

변경 사항이 원래 프로젝트에 통합 될 때까지이 포크를 유지하려는 경우에만이 옵션을 고려한 다음이 옵션을 포기해야합니다.

포크가 올바른 옵션인지 여부를 실제로 고려하십시오. '포크하지 말아야 할 이유'에 대한 수많은 Google 검색 결과 읽기

추리

jar를 사용하여 리포지토리를 블로킹하면 다운로드 크기가 증가하지 않습니다

jar는 output프로젝트 중 하나이며, 언제든 프로젝트에서 다시 생성 할 수 있으며 inputsGitHub 저장소에는 inputs.

나를 믿지 않습니까? 그런 다음 'git 바이너리를 저장하지 않음'에 대한 Google 결과를 확인하십시오 .

GitHub의 도움말 큰 파일로 작업 하면 같은 내용을 알 수 있습니다. 분명히 jar의 크기는 크지 않지만 소스 코드보다 크며 릴리스에서 jar를 만든 후에는 버전을 지정할 이유가 없습니다. 이것이 바로 새로운 릴리스의 목적입니다.

pom.xml에서 여러 개의 repos를 정의하면 리포지토리 수 x 아티팩트 수만큼 빌드 속도가 느려집니다.

스티븐 코놀리의 :

누군가 repo를 추가하면 아티팩트를 확인할 다른 repo가 ​​있으므로 빌드 성능에 영향을 미칩니다. 하나의 repo 만 추가하면 큰 문제는 아니지만 ... 문제가 커지고 다음으로 아는 것은 maven 빌드는 모든 아티팩트에 대해 50 개의 저장소를 확인하고 빌드 시간은 개입니다.

맞습니다! Maven은 모든 저장소 에서 최신 버전을 사용할 수 있으므로 pom.xml에 정의 된 모든 아티팩트 (및 해당 종속성)를 사용자가 정의한 모든 저장소와 비교하여 확인해야 합니다.

직접 시도해보십시오. 느린 빌드의 고통을 느낄 것입니다.

유물에 대한 가장 좋은 곳은 항아리에 대한 중앙 장소로, 메이븐 중앙에 있고,이 빌드는 지금까지 확인합니다 의미 곳.

저장소 소개에 대한 Maven의 문서에서 저장소에 대한 자세한 내용을 읽을 수 있습니다.


3
완전히 동의하고 잠시 동안 유지하려는 포크에 적합합니다. 그러나 이것은 기존 프로젝트에 대한 작은 패치로 인해 많은 오버 헤드가 될 수 있습니다.
emmby

5
그들이이 기능을 가능하게하는 플러그인을 작성했기 때문에 Github에 문제가 있다고 의심합니다. 나는 그것이 생각보다 작지만 동의합니다.
Phy6

4
Sonatype에 오픈 소스 프로젝트를 배포 할 수있는 것은 아닙니다. 예를 들어 프로젝트가 아직 배포되지 않은 다른 오픈 소스 프로젝트에 의존하는 경우 (소나타 입 요구 사항을 충족하지 않아 배포 할 수 없음).
Gab

1
@Gab 그렇다면 의존성은 실제로 오픈 소스가 아닙니다. 다른 프로젝트에 연락하여이를 설명하고 라이센스를 수정하도록하십시오. (Sun은 과거에이 행동의 범인이었습니다)
Bae

1
@Bae 라이센스 문제가 아닙니다. 일부 프로젝트 소유자는 우선 순위가 아니기 때문에 중앙에 게시하지 않기로 결정합니다. 당신의 길은 현실에서는 불가능합니다. 테스트하려면 중앙 code.google.com/p/sd-dss 에 게시하도록 설정하십시오 . 그것은 EU 공동체에 의해 자금이 지원되는 큰 오픈 소스 프로젝트입니다 :)
Gab

48

당신은 사용할 수 있습니다 JitPack 메이븐 이슈로 GitHub의 저장소를 노출 (공공 Git 저장소에 대한 무료). 이것은 정말 쉽습니다. 사용자는 이것을 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 릴리스가 있어야한다는 것입니다.

좋은 점은 배포 및 업로드를 처리 할 필요가 없다는 것입니다. 고유 한 아티팩트 저장소를 유지 보수하지 않으려 고했기 때문에 사용자 요구에 적합합니다.


JitPack은 꽤 좋지만 주위에있는 모든 groupId를 변경하도록 강요합니다. 그들은 이것을 피할 수 있다고 말하지만 회사의 DNS에 항목을 추가해야하므로 대부분의 경우 비실용적입니다. 나는 한 번 JP를 시도했지만, 나는 이것이 너무 어리석은 것이라고 결정했습니다.
zakmck

1
프로젝트의 groupId를 변경할 필요는 없습니다. 'com.github.User'groupId를 사용하여 해당 프로젝트를 계속 설치할 수 있습니다. 그러나 아마도 유스 케이스가 다를 수 있습니다.
Andrejs

그렇습니다. 조직 및 외부 사용자 주위에 이미 수십 개가 있고 그들 자신의 브랜드를 원하기 때문입니다. 내가 자신의 그룹 아이디로 나를 강요하도록 바보를 짓는 방법은 내가 직업을 바꾸려는 생각 중 하나입니다.
zakmck

또한 JP 직원이 저에게 그러한 요구 사항을 던져야 할 필요가 전혀 없습니다 (저장소 사양에서 Maven 요청을 가로 챌 수 있음).
zakmck

1
좋은 생각, 내가 해냈다 : github.com/jitpack/jitpack.io/issues/209 , 감사합니다 :-)
zakmck

9

또 다른 대안은 webdav를 지원하는 웹 호스팅을 사용하는 것입니다. 물론 어딘가에이 공간이 필요하지만 설정이 쉽고 전체 넥서스 서버를 실행하는 좋은 대안입니다.

이것을 빌드 섹션에 추가하십시오

     <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>

마지막으로 settings.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 저장소가 있습니다 단점 : 넥서스에는 관리 기능이 없습니다. 어딘가에 webdav 설정이 필요합니다.


9

2019 년부터 Github 패키지 레지스트리 라는 새로운 기능을 사용할 수 있습니다. .

기본적으로 프로세스는 다음과 같습니다.

  • github 설정에서 새로운 개인 액세스 토큰을 생성
  • 귀하의 저장소 및 토큰 정보를 추가하십시오 settings.xml
  • 를 사용하여 배포

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

2019 년 현재이 방법이 가장 좋습니다.
HRJ

1
그 / 그녀는 각각의 URL 및 인증 정보로 구성 Settings.XML이 필요 좋아하지만 다른 사람이 그것을 사용, 그것은 보인다
HEMU

매우 이상합니다 ... 공개 패키지를 만들지 만 다른 사람이이를 얻기 전에 인증이 필요합니다.
Amerousful

그러나, 개인의 repos를 들어, / 월 용도를 certaing 후, 가격은 그림에 온다
Lokeshwar 재단사

8

대안으로 Bintray 는 maven 리포지토리의 무료 호스팅을 제공합니다. groupId의 이름을 바꾸고 싶지 않으면 Sonatype OSS 와 Maven Central 의 좋은 대안 일 것입니다 . 그러나 변경 사항을 업스트림에 통합하거나 이름을 바꾸고 Central에 게시하려면 최소한 노력하십시오. 다른 사람이 포크를 사용하기가 훨씬 쉽습니다.


3
시도했을 때 믿을 수 없었지만 Bintray는 스냅 샷을 지원하지 않습니다. 쓸모없는.
zakmck

6
더 이상 무료가 아닙니다. 한 달에 150 달러.
AndroidDev

오픈 소스 소프트웨어 프로젝트는 유료라고 생각합니다 : jfrog.com/open-source
iBiber

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.