github에서 작업중 인 작은 오픈 소스 라이브러리 포크가 있습니다. maven을 통해 다른 개발자에게 제공하고 싶지만 내 Nexus 서버를 실행하고 싶지 않으며 포크이기 때문에 oss.sonatype.org에 쉽게 배포 할 수 없습니다.
내가하고 싶은 것은 다른 사람들이 maven을 사용하여 액세스 할 수 있도록 github에 배포하는 것입니다. 가장 좋은 방법은 무엇입니까?
github에서 작업중 인 작은 오픈 소스 라이브러리 포크가 있습니다. maven을 통해 다른 개발자에게 제공하고 싶지만 내 Nexus 서버를 실행하고 싶지 않으며 포크이기 때문에 oss.sonatype.org에 쉽게 배포 할 수 없습니다.
내가하고 싶은 것은 다른 사람들이 maven을 사용하여 액세스 할 수 있도록 github에 배포하는 것입니다. 가장 좋은 방법은 무엇입니까?
답변:
내가 찾은 최고의 솔루션은 다음 단계로 구성됩니다.
mvn-repo
메이븐 아티팩트를 호스팅 하는 분기를 작성하십시오 .mvn-repo
을 maven 저장소로 사용하도록 maven을 구성하십시오 .이 방법을 사용하면 몇 가지 이점이 있습니다.
mvn-repo
github 페이지가 gh-pages
(github 페이지를 사용하는 경우) 라는 별도의 분기에 유지되는 것처럼 소스라는 별도의 분기에서 소스와 별도로 유지됩니다gh-pages
사용하는 경우 충돌하지 않습니다 .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.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 프롬프트를 작성하는 방법을 알고 있다면 알려주십시오.)
그런 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의 프로파일에 이름을 명시하십시오.
<merge>true</merge>
site-maven-plugin 구성에서 설정하십시오. 그렇게하면 github에서 mvn-repo 브랜치를 수동으로 만들고 모든 파일을 처음부터 삭제해야한다고 생각합니다.
<altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository>
하려면 maven-deploy-plugin 및 site-maven-plugin 과 <outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>
함께 간단히 사용할 수도 있습니다 . 그러면 모든 아티팩트가 루트 ( "부모") 프로젝트에 배치되고 github의 해당 상위 디렉토리로 푸시됩니다. 그렇지 않으면 각 하위 모듈의 빌드가 이전에 빌드 된 하위 모듈의 빌드를 덮어 씁니다.
<github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
GitHub를 Maven 리포지토리로 사용하지 마십시오.
편집 :이 옵션은 많은 다운 투표권을 얻지 만 그 이유에 대한 의견은 없습니다. 이것은 실제로 GitHub에서 호스팅하는 기술적 기능에 관계없이 올바른 옵션입니다. GitHub에서 호스팅하는 것은 아래에 설명 된 모든 이유로 잘못되었으며 의견이 없으면 문제를 명확히하기 위해 답변을 개선 할 수 없습니다.
최상의 옵션-원본 프로젝트와 공동 작업
가장 좋은 방법은 원본 프로젝트에 변경 사항을 포함시키고 원본을 고수하도록 설득하는 것입니다.
대안-나만의 포크 유지
오픈 소스 라이브러리를 포크하고 포크도 오픈 소스이므로 포크를 Maven Central ( 중앙 리포지토리에 아티팩트 업로드 안내서 읽기) 에 업로드 하면 새롭 groupId
거나 새로운 것으로 표시 할 수 artifactId
있습니다.
변경 사항이 원래 프로젝트에 통합 될 때까지이 포크를 유지하려는 경우에만이 옵션을 고려한 다음이 옵션을 포기해야합니다.
포크가 올바른 옵션인지 여부를 실제로 고려하십시오. '포크하지 말아야 할 이유'에 대한 수많은 Google 검색 결과 읽기
추리
jar를 사용하여 리포지토리를 블로킹하면 다운로드 크기가 증가하지 않습니다
jar는 output
프로젝트 중 하나이며, 언제든 프로젝트에서 다시 생성 할 수 있으며 inputs
GitHub 저장소에는 inputs
.
나를 믿지 않습니까? 그런 다음 'git 바이너리를 저장하지 않음'에 대한 Google 결과를 확인하십시오 .
GitHub의 도움말 큰 파일로 작업 하면 같은 내용을 알 수 있습니다. 분명히 jar의 크기는 크지 않지만 소스 코드보다 크며 릴리스에서 jar를 만든 후에는 버전을 지정할 이유가 없습니다. 이것이 바로 새로운 릴리스의 목적입니다.
pom.xml에서 여러 개의 repos를 정의하면 리포지토리 수 x 아티팩트 수만큼 빌드 속도가 느려집니다.
스티븐 코놀리의 말 :
누군가 repo를 추가하면 아티팩트를 확인할 다른 repo가 있으므로 빌드 성능에 영향을 미칩니다. 하나의 repo 만 추가하면 큰 문제는 아니지만 ... 문제가 커지고 다음으로 아는 것은 maven 빌드는 모든 아티팩트에 대해 50 개의 저장소를 확인하고 빌드 시간은 개입니다.
맞습니다! Maven은 모든 저장소 에서 최신 버전을 사용할 수 있으므로 pom.xml에 정의 된 모든 아티팩트 (및 해당 종속성)를 사용자가 정의한 모든 저장소와 비교하여 확인해야 합니다.
직접 시도해보십시오. 느린 빌드의 고통을 느낄 것입니다.
유물에 대한 가장 좋은 곳은 항아리에 대한 중앙 장소로, 메이븐 중앙에 있고,이 빌드는 지금까지 확인합니다 의미 한 곳.
저장소 소개에 대한 Maven의 문서에서 저장소에 대한 자세한 내용을 읽을 수 있습니다.
당신은 사용할 수 있습니다 JitPack 메이븐 이슈로 GitHub의 저장소를 노출 (공공 Git 저장소에 대한 무료). 이것은 정말 쉽습니다. 사용자는 이것을 pom.xml에 추가해야합니다.
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
<dependency>
<groupId>com.github.User</groupId>
<artifactId>Repo name</artifactId>
<version>Release tag</version>
</dependency>
다른 곳 에서 대답 하자면 JitPack은 GitHub 저장소를 빌드하고 항아리를 제공한다는 것입니다. 요구 사항은 빌드 파일과 GitHub 릴리스가 있어야한다는 것입니다.
좋은 점은 배포 및 업로드를 처리 할 필요가 없다는 것입니다. 고유 한 아티팩트 저장소를 유지 보수하지 않으려 고했기 때문에 사용자 요구에 적합합니다.
또 다른 대안은 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 설정이 필요합니다.
2019 년부터 Github 패키지 레지스트리 라는 새로운 기능을 사용할 수 있습니다. .
기본적으로 프로세스는 다음과 같습니다.
settings.xml
를 사용하여 배포
mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token
대안으로 Bintray 는 maven 리포지토리의 무료 호스팅을 제공합니다. groupId의 이름을 바꾸고 싶지 않으면 Sonatype OSS 와 Maven Central 의 좋은 대안 일 것입니다 . 그러나 변경 사항을 업스트림에 통합하거나 이름을 바꾸고 Central에 게시하려면 최소한 노력하십시오. 다른 사람이 포크를 사용하기가 훨씬 쉽습니다.
당신이 aar
또는 jar
파일 자체 를 가지고 있거나 플러그인을 사용하고 싶지 않다면- 간단한 쉘 스크립트를 만들었습니다 . 아티팩트를 Github에 게시하고이를 공용 Maven 저장소로 사용할 수 있습니다.