Hosting repositori Maven di github

312

Saya memiliki garpu perpustakaan kecil bersumber terbuka yang sedang saya kerjakan di github. Saya ingin membuatnya tersedia untuk pengembang lain melalui maven, tetapi saya tidak ingin menjalankan server Nexus saya sendiri, dan karena itu garpu, saya tidak dapat dengan mudah menyebarkannya ke oss.sonatype.org.

Yang ingin saya lakukan adalah menyebarkannya ke github sehingga orang lain dapat mengaksesnya menggunakan pakar. Apa cara terbaik untuk melakukan ini?

emmby
sumber
5
masalah lisensi apa yang Anda hadapi di OSS Sonatype? Hanya ingin tahu karena saya menggunakannya sendiri.
Archimedes Trajano
5
Ada alat yang memungkinkan Anda untuk mengekspos repo GitHub Anda melalui maven secara langsung. jitpack.io stackoverflow.com/a/28483461/3975649
metrimer
1
Github juga mengumumkan paket registri yang mendukung pakar. Saat ini dalam versi beta-publik: github.com/features/package-registry
Kaan

Jawaban:

484

Solusi terbaik yang dapat saya temukan terdiri dari langkah-langkah ini:

  1. Buat cabang yang dipanggil mvn-repountuk meng-host artefak pakar Anda.
  2. Gunakan situs github -maven-plugin untuk mendorong artefak Anda ke github.
  3. Konfigurasikan pakar untuk menggunakan remote Anda mvn-reposebagai repositori maven.

Ada beberapa manfaat menggunakan pendekatan ini:

  • Artefak Maven disimpan terpisah dari sumber Anda di cabang terpisah yang disebut mvn-repo, seperti halaman github disimpan dalam cabang terpisah yang disebut gh-pages(jika Anda menggunakan halaman github)
  • Tidak seperti beberapa solusi lain yang diusulkan, itu tidak bertentangan dengan Anda gh-pagesjika Anda menggunakannya.
  • Ikatan secara alami dengan target penyebaran sehingga tidak ada perintah pakar baru untuk dipelajari. Cukup gunakan mvn deployseperti biasa

Cara khas Anda menggunakan artefak ke repo pakar jarak jauh adalah dengan menggunakan mvn deploy, jadi mari kita tambal ke dalam mekanisme untuk solusi ini.

Pertama, beri tahu pakar untuk menyebarkan artefak ke lokasi pementasan sementara di dalam direktori target Anda. Tambahkan ini ke Anda 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>

Sekarang coba jalankan mvn clean deploy. Anda akan melihat bahwa itu dikerahkan repositori maven Anda untuk target/mvn-repo. Langkah selanjutnya adalah membuatnya mengunggah direktori itu ke GitHub.

Tambahkan informasi autentikasi Anda ke ~/.m2/settings.xmlsehingga github site-maven-plugindapat mendorong ke 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>

(Sebagaimana dicatat, pastikan untuk chmod 700 settings.xmlmemastikan tidak ada yang bisa membaca kata sandi Anda di file. Jika seseorang tahu cara membuat situs-maven-plugin meminta kata sandi alih-alih memerlukannya dalam file konfigurasi, beri tahu saya.)

Kemudian beri tahu GitHub site-maven-plugintentang server baru yang baru saja Anda konfigurasikan dengan menambahkan yang berikut ke pom Anda:

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

Terakhir, konfigurasikan site-maven-pluginuntuk mengunggah dari repo sementara Anda ke mvn-repocabang Anda di 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-repocabang tidak perlu ada, itu akan dibuat untuk Anda.

Sekarang jalankan mvn clean deploylagi. Anda akan melihat maven-deploy-plugin "mengunggah" file ke repositori pementasan lokal Anda di direktori target, lalu situs-maven-plugin melakukan file-file itu dan mendorongnya ke server.

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

Kunjungi github.com di browser Anda, pilih mvn-repocabang, dan verifikasi bahwa semua binari Anda ada di sana.

masukkan deskripsi gambar di sini

Selamat!

Anda sekarang dapat menggunakan artefak pakar Anda ke repo publik orang miskin hanya dengan berlari mvn clean deploy.

Ada satu langkah lagi yang ingin Anda ambil, yaitu mengkonfigurasi setiap pom yang bergantung pada pom Anda untuk mengetahui di mana repositori Anda. Tambahkan cuplikan berikut ke pom proyek apa pun yang bergantung pada proyek Anda:

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

Sekarang setiap proyek yang memerlukan file jar Anda akan secara otomatis mengunduhnya dari repositori github maven Anda.

Sunting: untuk menghindari masalah yang disebutkan dalam komentar ('Kesalahan membuat komit: Permintaan tidak valid. Untuk' properti / nama ', nil bukan string.'), Pastikan Anda menyatakan nama di profil Anda di github.

emmby
sumber
25
Perhatikan juga bahwa solusi ini akan menimpa artefak Anda sebelumnya setiap kali Anda menggunakan. Ini sesuai untuk repositori snapshot, tetapi tidak untuk artefak yang dirilis. Untuk menonaktifkan perilaku itu, atur <merge>true</merge>konfigurasi situs-maven-plugin Anda. Jika Anda melakukannya, saya pikir Anda harus secara manual membuat cabang mvn-repo di github dan menghapus semua file-nya pertama kali.
emmby
13
+1 pintar dan disajikan dengan baik. Satu-satunya kritik saya adalah Anda tidak menyertakan tautan ke situs plugin Maven: github.com/github/maven-plugins . Terima kasih saya sedang mencari cara untuk mempublikasikan situs Maven saya ke github!
Mark O'Connor
7
Pendekatan ini tidak berfungsi ketika otentikasi Dua-Faktor digunakan pada github. Lihat catatan saya dalam masalah di sini: github.com/github/maven-plugins/issues/36#issuecomment-31005606
Dag
18
Untuk membuat ini berfungsi untuk proyek-proyek multi-modul , Anda juga bisa menggunakan <altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository>dengan maven-deploy-plugin , dan <outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>dengan situs-maven-plugin . Ini akan menyebarkan semua artefak ke proyek root ("parent"), dan mendorongnya ke direktori induk masing-masing di github. Kalau tidak, pembangunan setiap sub-modul akan menimpa sub-modul yang dibangun sebelum ...
sd
7
Dua saran yang membuatnya berfungsi (setidaknya untuk saya): Tetapkan versi plugin Github saat ini (saat ini akan menjadi 0,11). Saya juga menyarankan semua orang untuk menggunakan token OAUTH alih-alih kata sandi. Anda dapat membuatnya di 'Pengaturan-> Aplikasi-> Token Akses Pribadi'. Selain itu Anda juga dapat memasukkannya ke dalam POM melalui dan menyimpan token sebagai variabel lingkungan. <github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
Florian Loch
120

Jangan gunakan GitHub sebagai Repositori Maven.

Sunting: Opsi ini mendapat banyak suara turun, tetapi tidak ada komentar mengapa. Ini adalah opsi yang benar terlepas dari kemampuan teknis untuk menjadi tuan rumah di GitHub. Hosting di GitHub salah karena semua alasan yang diuraikan di bawah ini dan tanpa komentar, saya tidak dapat meningkatkan jawaban untuk mengklarifikasi masalah Anda.

Opsi Terbaik - Berkolaborasi dengan Proyek Asli

Pilihan terbaik adalah meyakinkan proyek asli untuk memasukkan perubahan Anda dan tetap dengan yang asli.

Alternatif - Pertahankan Fork Anda sendiri

Karena Anda telah bercabang pustaka sumber terbuka, dan garpu Anda juga merupakan sumber terbuka, Anda dapat mengunggah garpu Anda ke Maven Central (baca Panduan untuk mengunggah artefak ke Repositori Pusat ) dengan memberikan yang baru groupIddan mungkin yang baru artifactId.

Pertimbangkan opsi ini hanya jika Anda bersedia mempertahankan garpu ini sampai perubahan dimasukkan ke dalam proyek asli dan kemudian Anda harus meninggalkan yang ini.

Sangat mempertimbangkan keras apakah garpu adalah pilihan yang tepat. Baca berbagai hasil Google untuk 'mengapa tidak melakukan fork'

Pemikiran

Memperbesar repositori Anda dengan toples meningkatkan ukuran unduhan tanpa manfaat

Guci adalah salah satu outputdari proyek Anda, dapat dibuat ulang kapan saja inputs, dan repo GitHub Anda hanya boleh berisiinputs .

Tidak percaya padaku Kemudian periksa hasil Google untuk 'jangan menyimpan binari di git' .

Bantuan GitHub Bekerja dengan file besar akan memberi tahu Anda hal yang sama. Memang toples itu tidak besar tetapi mereka lebih besar dari kode sumber dan sekali toples telah dibuat oleh rilis mereka tidak punya alasan untuk versi - itu adalah tujuan dari rilis baru.

Menentukan beberapa repo di pom.xml Anda memperlambat pembangunan berdasarkan Jumlah Repositori kali Jumlah Artefak

Stephen Connolly mengatakan :

Jika ada yang menambahkan repo Anda, mereka memengaruhi kinerja pembangunan mereka karena mereka sekarang memiliki repo lain untuk memeriksa artefak melawan ... Itu bukan masalah besar jika Anda hanya perlu menambahkan satu repo ... Tapi masalahnya bertambah dan selanjutnya Anda tahu Anda maven build memeriksa 50 repo untuk setiap artefak dan waktu build adalah seekor anjing.

Betul sekali! Maven perlu memeriksa setiap artefak (dan dependensinya) yang ditentukan dalam pom.xml Anda terhadap setiap Repositori yang telah Anda tetapkan , karena versi yang lebih baru mungkin tersedia di salah satu repositori tersebut.

Cobalah sendiri dan Anda akan merasakan sakitnya tubuh yang lambat.

Tempat terbaik untuk artefak adalah di Maven Central, sebagai tempat utama untuk guci, dan ini berarti bangunan Anda hanya akan memeriksa satu tempat.

Anda dapat membaca lebih lanjut tentang repositori di dokumentasi Maven tentang Pengantar Repositori

Bae
sumber
3
Sepenuhnya setuju, dan masuk akal untuk garpu yang ingin Anda pertahankan sebentar. Tapi ini bisa menjadi banyak overhead hanya untuk tambalan kecil ke proyek yang ada.
emmby
5
Saya ragu Github memiliki masalah dengan itu, karena mereka menulis plugin yang memungkinkan kemampuan ini. Saya setuju itu kurang dari ide, tapi c'est la vie.
Phy6
4
Tidak selalu mungkin untuk menggunakan proyek sumber terbuka di Sonatype. Misalnya ketika proyek Anda bergantung pada proyek open source lain yang belum digunakan (dan tidak dapat digunakan karena tidak memenuhi persyaratan sonatype).
Gab
1
@ Ambil maka ketergantungan Anda tidak benar-benar open source. Anda harus menghubungi proyek lain dan menjelaskan ini dan meminta mereka untuk memperbaiki lisensi mereka. (Sun adalah penyebab perilaku ini di masa lalu)
Bae
1
@ Bae Ini bukan masalah perizinan. Beberapa pemilik proyek memutuskan untuk tidak menerbitkan di pusat hanya karena itu bukan prioritas mereka. Cara Anda tidak mungkin di dunia nyata. Jika Anda ingin menguji: yakinkan ini untuk menerbitkan di Central code.google.com/p/sd-dss . Ini adalah proyek Open Source besar yang didanai oleh komunitas UE :)
Gab
48

Anda dapat menggunakan JitPack (gratis untuk repositori Git publik) untuk mengekspos repositori GitHub Anda sebagai artefak Maven. Sangat mudah. Pengguna Anda perlu menambahkan ini ke pom.xml mereka:

  1. Tambahkan repositori:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. Tambahkan ketergantungan:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

Seperti dijawab di tempat lain , idenya adalah bahwa JitPack akan membangun repo GitHub Anda dan akan melayani toples. Syaratnya adalah Anda memiliki file build dan rilis GitHub.

Yang menyenangkan adalah Anda tidak harus menangani penyebaran dan unggahan. Karena Anda tidak ingin mempertahankan repositori artefak Anda sendiri, ini cocok dengan kebutuhan Anda.

Andrejs
sumber
JitPack cukup bagus, tetapi memaksa Anda untuk mengubah setiap groupId yang Anda miliki. Mereka mengatakan bahwa ini dapat dihindari, tetapi mengharuskan Anda menambahkan entri ke DNS perusahaan Anda, yang pada umumnya tidak praktis. Saya sudah mencoba dengan JP sekali, lalu saya memutuskan bahwa ini terlalu bodoh untuk melanjutkan.
zakmck
1
Mengubah groupId proyek Anda tidak perlu dilakukan. Anda masih dapat menginstal proyek-proyek tersebut menggunakan groupId 'com.github.User'. Tapi mungkin use case Anda berbeda.
Andrejs
Ya, sangat banyak. Karena saya sudah memiliki puluhan di sekitar organisasi saya dan pengguna eksternal, dan karena saya ingin merek saya sendiri. Bagaimana seseorang bisa begitu bodoh untuk mencoba memaksaku ke dalam kelompoknya sendiri? Aku adalah salah satu hal mengapa aku berpikir untuk membuat perubahan karier.
zakmck
Selain itu, saya tidak melihat ada kebutuhan nyata bagi orang-orang JP untuk melemparkan persyaratan seperti itu kepada saya (mereka hanya bisa mencegat permintaan Maven dari spesifikasi repositori).
zakmck
1
Ide bagus, saya sudah melakukannya: github.com/jitpack/jitpack.io/issues/209 , terima kasih :-)
zakmck
9

Alternatif lain adalah menggunakan hosting web apa pun dengan dukungan webdav. Anda akan memerlukan ruang untuk ini di suatu tempat tentu saja tetapi mudah untuk mengatur dan alternatif yang baik untuk menjalankan server nexus penuh sesak nafas.

tambahkan ini ke bagian build Anda

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

Tambahkan sesuatu seperti ini ke bagian Manajemen distribusi Anda

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

Akhirnya pastikan untuk mengatur akses repositori di settings.xml Anda

tambahkan ini ke bagian server Anda

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

dan definisi untuk bagian repositori Anda

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

Terakhir, jika Anda memiliki hosting php standar, Anda dapat menggunakan sesuatu seperti sabredav untuk menambahkan kemampuan webdav.

Keuntungan: Anda memiliki repositori maven sendiri Kerugian: Anda tidak memiliki kemampuan manajemen apa pun di nexus; Anda memerlukan pengaturan webdav di suatu tempat

Jilles van Gurp
sumber
9

Sejak 2019 Anda sekarang dapat menggunakan fungsi baru yang disebut registri paket Github .

Pada dasarnya prosesnya adalah:

  • menghasilkan token akses pribadi baru dari pengaturan github
  • tambahkan info repositori dan token di settings.xml
  • gunakan menggunakan

    mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token  
Ruslan López
sumber
Pada 2019, ini adalah pilihan terbaik.
HRJ
1
Tetapi untuk menggunakannya oleh orang lain, sepertinya dia perlu mengonfigurasi pengaturan.xml dengan masing-masing URL dan info auth
hemu
Sangat aneh ... Anda membuat paket publik Anda, tetapi orang lain perlu otentikasi sebelum mendapatkannya
Amerousful
Namun, untuk repo pribadi, setelah menggunakan penggunaan / bulan, penetapan harganya muncul
Lokeshwar Tailor
8

Sebagai alternatif, Bintray menyediakan hosting gratis dari repositori pakar. Itu mungkin alternatif yang baik untuk Sonatype OSS dan Maven Central jika Anda benar-benar tidak ingin mengganti nama groupId. Tapi tolong, setidaknya upayakan agar perubahan Anda terintegrasi di hulu atau ganti nama dan publikasikan ke Central. Ini membuat orang lain lebih mudah menggunakan garpu Anda.

Guillaume
sumber
3
Saya tidak percaya ketika saya mencoba, tetapi Bintray tidak mendukung snapshot. Tak berguna.
zakmck
6
Ini tidak gratis lagi. $ 150 sebulan.
AndroidDev
Saya pikir ini adalah biaya untuk proyek perangkat lunak open source: jfrog.com/open-source
iBiber
0

Jika Anda hanya memiliki aaratau jarfile sendiri, atau hanya tidak ingin menggunakan plugin - Saya telah membuat skrip shell sederhana . Anda dapat mencapai hal yang sama dengannya - menerbitkan artefak Anda ke Github dan menggunakannya sebagai repo Maven publik.

Orest Savchak
sumber