Lưu trữ một kho lưu trữ Maven trên github


312

Tôi có một ngã ba của một thư viện có nguồn mở nhỏ mà tôi đang làm việc trên github. Tôi muốn cung cấp nó cho các nhà phát triển khác thông qua maven, nhưng tôi không muốn chạy máy chủ Nexus của riêng mình và vì đó là một ngã ba nên tôi không thể dễ dàng triển khai nó lên oss.sonatype.org.

Những gì tôi muốn làm là triển khai nó lên github để những người khác có thể truy cập nó bằng maven. Cách tốt nhất để làm điều này là gì?


5
bạn gặp phải vấn đề cấp phép nào trong OSS Sonatype? Chỉ tò mò từ khi tôi sử dụng nó cho mình.
Archimedes Trajano

5
Có một công cụ cho phép bạn hiển thị repo GitHub của bạn thông qua maven trực tiếp. jitpack.io stackoverflow.com/a/28483461/3975649
metrimer

1
Github cũng đã công bố một gói đăng ký hỗ trợ maven. Hiện đang ở chế độ beta công khai: github.com/features/package-regology
Kaan

Câu trả lời:


484

Giải pháp tốt nhất tôi có thể tìm thấy bao gồm các bước sau:

  1. Tạo một nhánh được gọi mvn-repođể lưu trữ các tạo tác maven của bạn.
  2. Sử dụng github site-maven-plugin để đẩy các tạo phẩm của bạn lên github.
  3. Cấu hình maven để sử dụng điều khiển từ xa của bạn mvn-reponhư một kho lưu trữ maven.

Có một số lợi ích khi sử dụng phương pháp này:

  • Các tạo phẩm của Maven được giữ tách biệt với nguồn của bạn trong một nhánh riêng được gọi mvn-repo, giống như các trang github được giữ trong một nhánh riêng gọi là gh-pages(nếu bạn sử dụng các trang github)
  • Không giống như một số giải pháp được đề xuất khác, nó không xung đột với bạn gh-pagesnếu bạn đang sử dụng chúng.
  • Liên kết một cách tự nhiên với mục tiêu triển khai nên không có lệnh maven mới để học. Chỉ cần sử dụng mvn deploynhư bình thường

Cách điển hình mà bạn triển khai các tạo phẩm cho một repo maven từ xa là sử dụng mvn deploy, vì vậy hãy vá vào cơ chế đó cho giải pháp này.

Đầu tiên, hãy bảo maven triển khai các tạo phẩm đến một vị trí dàn dựng tạm thời trong thư mục đích của bạn. Thêm phần này vào 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>

Bây giờ hãy thử chạy mvn clean deploy. Bạn sẽ thấy rằng nó đã triển khai kho lưu trữ maven của bạn target/mvn-repo. Bước tiếp theo là làm cho nó tải thư mục đó lên GitHub.

Thêm thông tin xác thực của bạn để ~/.m2/settings.xmlgithub site-maven-plugincó thể đẩy lên 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>

(Như đã nói, hãy chắc chắn chmod 700 settings.xmlđể đảm bảo không ai có thể đọc mật khẩu của bạn trong file. Nếu ai đó biết làm thế nào để làm cho trang web-maven-Plugin nhắc cho một mật khẩu thay vì đòi hỏi phải có nó trong một tập tin cấu hình, cho tôi biết.)

Sau đó, nói với GitHub site-maven-pluginvề máy chủ mới mà bạn vừa cấu hình bằng cách thêm phần sau vào pom của bạn:

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

Cuối cùng, định cấu hình site-maven-pluginđể tải lên từ repo dàn dựng tạm thời của bạn đến mvn-repochi nhánh của bạn trên 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>

Các mvn-repochi nhánh không cần phải tồn tại, nó sẽ được tạo ra cho bạn.

Bây giờ chạy mvn clean deploylại. Bạn sẽ thấy maven-integration-plugin "tải" các tệp lên kho lưu trữ cục bộ của bạn trong thư mục đích, sau đó site-maven-plugin cam kết các tệp đó và đẩy chúng vào máy chủ.

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

Truy cập github.com trong trình duyệt của bạn, chọn mvn-repochi nhánh và xác minh rằng tất cả các nhị phân của bạn hiện đang ở đó.

nhập mô tả hình ảnh ở đây

Xin chúc mừng!

Bây giờ bạn có thể triển khai các tạo tác maven của mình cho repo công khai của một người nghèo chỉ bằng cách chạy mvn clean deploy.

Còn một bước nữa bạn sẽ muốn thực hiện, đó là định cấu hình bất kỳ pom nào phụ thuộc vào pom của bạn để biết kho lưu trữ của bạn ở đâu. Thêm đoạn mã sau vào bất kỳ dự án nào phụ thuộc vào dự án của bạn:

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

Bây giờ, bất kỳ dự án nào yêu cầu tệp jar của bạn sẽ tự động tải xuống từ kho lưu trữ github maven của bạn.

Chỉnh sửa: để tránh sự cố được đề cập trong các nhận xét ('Lỗi khi tạo cam kết: Yêu cầu không hợp lệ. Đối với' property / name ', nil không phải là một chuỗi.'), Hãy đảm bảo bạn nêu tên trong hồ sơ của mình trên github.


25
Cũng lưu ý rằng giải pháp này sẽ ghi đè lên các tạo phẩm trước đó của bạn mỗi khi bạn triển khai. Điều này là thích hợp cho các kho lưu trữ ảnh chụp nhanh, nhưng không phải cho các tạo phẩm được phát hành. Để vô hiệu hóa hành vi đó, hãy đặt <merge>true</merge>trong cấu hình plugin-maven-plugin của bạn. Tuy nhiên, nếu bạn làm điều đó, tôi nghĩ bạn sẽ phải tự tạo chi nhánh mvn-repo trong github và xóa tất cả các tệp của nó lần đầu tiên.
emmby

13
+1 thông minh và trình bày tốt. Lời chỉ trích duy nhất của tôi là bạn không bao gồm một liên kết đến trang web bổ trợ Maven: github.com/github/maven-plugins . Thx Tôi đang tìm cách để xuất bản trang Maven của mình lên github!
Đánh dấu O'Connor

7
Cách tiếp cận này không hoạt động khi xác thực Hai yếu tố được sử dụng trên github. Xem ghi chú của tôi trong số báo tại đây: github.com/github/maven-plugins/issues/36#issuecomment-31005606
Dag

18
Để thực hiện công việc này cho các dự án đa mô-đun , bạn cũng có thể chỉ cần sử dụng <altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository>với maven-triển khai-plugin<outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>với trang web-maven-plugin . Điều này sẽ triển khai tất cả các tạo phẩm vào dự án gốc ("cha mẹ") và đẩy chúng vào thư mục gốc tương ứng trên github. Mặt khác, bản dựng của mỗi mô-đun phụ sẽ ghi đè lên mô-đun phụ được xây dựng trước ...
sd

7
Hai đề xuất làm cho nó hoạt động (ít nhất là đối với tôi): Đặt phiên bản hiện tại của plugin Github (ngay bây giờ nó sẽ là 0.11). Ngoài ra, tôi sẽ đề nghị mọi người sử dụng mã thông báo OAUTH thay vì mật khẩu. Bạn có thể tạo nó trong 'Cài đặt-> Ứng dụng-> Mã truy cập cá nhân'. Hơn bạn cũng có thể nội tuyến nó vào POM thông qua và lưu trữ mã thông báo dưới dạng biến môi trường. <github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
Florian Loch

120

Đừng sử dụng GitHub làm Kho lưu trữ Maven.

Chỉnh sửa: Tùy chọn này nhận được rất nhiều phiếu bầu, nhưng không có ý kiến ​​về lý do tại sao. Đây là tùy chọn chính xác bất kể khả năng kỹ thuật để lưu trữ trên GitHub. Lưu trữ trên GitHub là sai vì tất cả các lý do được nêu dưới đây và không có nhận xét Tôi không thể cải thiện câu trả lời để làm rõ vấn đề của bạn.

Lựa chọn tốt nhất - Hợp tác với Dự án ban đầu

Tùy chọn tốt nhất là thuyết phục dự án ban đầu bao gồm các thay đổi của bạn và gắn bó với bản gốc.

Thay thế - Duy trì Ngã ba của riêng bạn

Vì bạn đã rẽ nhánh một thư viện nguồn mở và ngã ba của bạn cũng là nguồn mở, bạn có thể tải lên ngã ba của mình lên Maven Central (đọc Hướng dẫn để tải các tạo phẩm vào Kho lưu trữ trung tâm ) bằng cách cung cấp cho nó một cái mới groupIdvà có thể là một cái mới artifactId.

Chỉ xem xét tùy chọn này nếu bạn sẵn sàng duy trì ngã ba này cho đến khi các thay đổi được đưa vào dự án ban đầu và sau đó bạn nên từ bỏ cái này.

Thực sự xem xét khó khăn cho dù một ngã ba là lựa chọn đúng. Đọc vô số kết quả của Google để biết 'tại sao không rẽ nhánh'

Lý luận

Làm đầy kho lưu trữ của bạn với các lọ làm tăng kích thước tải xuống không có lợi

Một jar là một outputdự án của bạn, nó có thể được tạo lại bất cứ lúc nào từ nó inputsvà repo GitHub của bạn chỉ nên chứa inputs.

Đừng tin tôi? Sau đó kiểm tra kết quả của Google để 'không lưu trữ nhị phân trong git' .

Trợ giúp của GitHub Làm việc với các tệp lớn sẽ cho bạn biết điều tương tự. Phải thừa nhận rằng jar không lớn nhưng chúng lớn hơn mã nguồn và một khi jar được tạo bởi một bản phát hành, chúng không có lý do gì để được phiên bản - đó là bản phát hành mới dành cho.

Việc xác định nhiều repos trong pom.xml của bạn làm chậm quá trình xây dựng của bạn theo Số lần lưu trữ Số lần tạo tác

Stephen Connolly nói :

Nếu bất cứ ai thêm repo của bạn, họ sẽ ảnh hưởng đến hiệu suất xây dựng của họ vì bây giờ họ có một repo khác để kiểm tra các tạo phẩm chống lại ... Đó không phải là vấn đề lớn nếu bạn chỉ phải thêm một repo ... Nhưng vấn đề phát triển và điều tiếp theo bạn biết maven build đang kiểm tra 50 repos cho mỗi tạo tác và thời gian xây dựng là một con chó.

Đúng rồi! Maven cần kiểm tra mọi tạo phẩm (và các phụ thuộc của nó) được xác định trong tệp pom.xml của bạn so với mọi Kho lưu trữ mà bạn đã xác định , vì một phiên bản mới hơn có thể có sẵn trong bất kỳ kho lưu trữ nào.

Hãy tự mình thử và bạn sẽ cảm thấy nỗi đau của việc xây dựng chậm.

Nơi tốt nhất để tạo tác là ở Maven Central, vì đây là nơi trung tâm của các lọ và điều này có nghĩa là công trình của bạn sẽ chỉ kiểm tra một nơi.

Bạn có thể đọc thêm một số thông tin về kho lưu trữ tại tài liệu của Maven về Giới thiệu về kho lưu trữ


3
Hoàn toàn đồng ý, và có ý nghĩa cho các dĩa bạn muốn giữ xung quanh trong một thời gian. Nhưng điều này có thể là rất nhiều chi phí cho một bản vá nhỏ cho một dự án hiện có.
emmby

5
Tôi nghi ngờ Github có vấn đề với nó, vì họ đã viết plugin cho phép khả năng này. Tôi đồng ý nó ít hơn ý tưởng, nhưng đó là la vie.
Phy6

4
Không phải lúc nào cũng có thể triển khai một dự án nguồn mở trên Sonatype. Chẳng hạn, khi dự án của bạn phụ thuộc vào một dự án nguồn mở khác mà nó chưa được triển khai (và nó không thể được triển khai vì nó không đáp ứng các yêu cầu của sonatype).
Gab

1
@Gab thì sự phụ thuộc của bạn không thực sự là nguồn mở. Bạn nên liên hệ với dự án khác và giải thích điều này và yêu cầu họ sửa lỗi cấp phép của họ. (Sun là thủ phạm của hành vi này trong quá khứ)
Bae

1
@Bae Đây không phải là vấn đề cấp phép. Một số chủ dự án quyết định không xuất bản trên trung tâm đơn giản vì đó không phải là ưu tiên của họ. Cách của bạn là không thể trong thế giới thực. Nếu bạn muốn kiểm tra: hãy thuyết phục điều này để xuất bản trên Central code.google.com/p/sd-dss . Đây là một dự án nguồn mở lớn được tài trợ bởi cộng đồng EU :)
Gab

48

Bạn có thể sử dụng JitPack (miễn phí cho các kho Git công cộng) để hiển thị kho lưu trữ GitHub của bạn dưới dạng một tạo tác Maven. Nó rất dễ. Người dùng của bạn sẽ cần thêm phần này vào tệp pom.xml của họ:

  1. Thêm kho lưu trữ:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. Thêm phụ thuộc:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

Như đã trả lời ở nơi khác , ý tưởng là JitPack sẽ xây dựng repo GitHub của bạn và sẽ phục vụ các lọ. Yêu cầu là bạn có tệp xây dựng và bản phát hành GitHub.

Điều tuyệt vời là bạn không phải xử lý việc triển khai và tải lên. Vì bạn không muốn duy trì kho lưu trữ tạo tác của riêng mình, nó phù hợp với nhu cầu của bạn.


JitPack khá tốt, nhưng buộc bạn phải thay đổi mọi nhóm mà bạn có xung quanh. Họ nói rằng điều này có thể tránh được, nhưng nó yêu cầu bạn thêm một mục vào DNS của công ty bạn, điều này hoàn toàn không thực tế trong hầu hết các trường hợp. Tôi đã từng thử với JP một lần, sau đó tôi quyết định rằng điều này quá ngu ngốc để đi trước.
zakmck

1
Thay đổi nhómId của các dự án của bạn là không cần thiết. Bạn vẫn có thể cài đặt các dự án đó bằng cách sử dụng 'com.github.User' groupId. Nhưng có lẽ trường hợp sử dụng của bạn là khác nhau.
Andrejs

Vâng, nó rất nhiều. Bởi vì tôi đã có hàng chục người trong số họ xung quanh tổ chức của mình và người dùng bên ngoài, và vì tôi muốn thương hiệu của riêng mình trên họ. Làm thế nào một người có thể ngu ngốc đến mức cố ép tôi vào nhóm riêng của anh ấy là một trong những lý do tại sao tôi nghĩ đến việc thay đổi nghề nghiệp.
zakmck

Hơn nữa, tôi không thấy bất kỳ nhu cầu thực sự nào đối với các anh chàng JP để đưa ra yêu cầu như vậy đối với tôi (họ chỉ có thể chặn các yêu cầu Maven từ thông số kho lưu trữ).
zakmck

1
Ý tưởng hay, tôi đã thực hiện nó: github.com/jitpack/jitpack.io/issues/209 , cảm ơn :-)
zakmck

9

Một cách khác là sử dụng bất kỳ lưu trữ web nào có hỗ trợ webdav. Bạn sẽ cần một số không gian cho việc này ở đâu đó tất nhiên nhưng nó rất đơn giản để thiết lập và một giải pháp thay thế tốt để chạy một máy chủ nexus đầy đủ.

thêm phần này vào phần xây dựng của bạn

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

Thêm một cái gì đó như thế này vào phần Quản lý phân phối của bạn

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

Cuối cùng, hãy đảm bảo thiết lập quyền truy cập kho lưu trữ trong tệp settings.xml của bạn

thêm phần này vào phần máy chủ của bạn

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

và một định nghĩa cho phần kho của bạn

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

Cuối cùng, nếu bạn có bất kỳ lưu trữ php tiêu chuẩn nào, bạn có thể sử dụng một cái gì đó như sabredav để thêm các khả năng webdav.

Ưu điểm: bạn có kho lưu trữ maven của riêng bạn Nhược điểm: bạn không có bất kỳ khả năng quản lý nào trong nexus; bạn cần một số thiết lập webdav ở đâu đó


9

Kể từ năm 2019, giờ đây bạn có thể sử dụng chức năng mới có tên là gói đăng ký Github .

Về cơ bản quy trình là:

  • tạo mã thông báo truy cập cá nhân mới từ cài đặt github
  • thêm thông tin kho lưu trữ và mã thông báo trong của bạn settings.xml
  • triển khai sử dụng

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

Tính đến năm 2019, đây là lựa chọn tốt nhất.
HRJ

1
Nhưng để người khác sử dụng nó, có vẻ như anh ấy / cô ấy cần phải định cấu hình
tệp

Rất lạ ... Bạn tạo gói công khai của mình, nhưng người khác cần xác thực trước khi nhận được
Amerousful

Tuy nhiên, đối với các repos tư nhân, sau khi chứng nhận sử dụng / tháng, giá cả sẽ thành hình ảnh
Nhà may Lokeshwar

8

Thay thế, Bintray cung cấp lưu trữ miễn phí các kho lưu trữ maven. Đó có lẽ là một lựa chọn tốt cho Sonatype OSS và Maven Central nếu bạn hoàn toàn không muốn đổi tên nhómId. Nhưng xin vui lòng, ít nhất hãy nỗ lực để các thay đổi của bạn được tích hợp ngược dòng hoặc đổi tên và xuất bản lên Trung tâm. Nó làm cho nó dễ dàng hơn nhiều cho người khác sử dụng ngã ba của bạn.


3
Tôi không thể tin điều đó khi tôi thử, nhưng Bintray không hỗ trợ ảnh chụp nhanh. Vô ích.
zakmck

6
Nó không còn miễn phí nữa. $ 150 một tháng.
AndroidDev

Tôi nghĩ rằng đó là phí cho các dự án phần mềm nguồn mở: jfrog.com/open-source
iBiber

0

Nếu bạn chỉ có aarhoặc jartự gửi tệp hoặc không muốn sử dụng plugin - Tôi đã tạo một tập lệnh shell đơn giản . Bạn có thể đạt được điều tương tự với nó - xuất bản các tạo phẩm của bạn lên Github và sử dụng nó làm repo Maven công khai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.