Github'da bir Maven deposuna ev sahipliği yapmak


312

Github üzerinde çalıştığım açık kaynaklı küçük bir kütüphanem var. Bunu maven üzerinden diğer geliştiricilere sunmak istiyorum, ancak kendi Nexus sunucumu çalıştırmak istemiyorum ve bu bir çatal olduğundan oss.sonatype.org adresine kolayca dağıtamam.

Yapmak istediğim şey, başkalarının maven kullanarak erişebilmesi için github'a dağıtmak. Bunu yapmanın en iyi yolu nedir?


5
OSS Sonatype'ta hangi lisanslama sorunlarıyla karşılaşıyorsunuz? Sadece kendim kullandığımdan beri merak ediyorum.
Archimedes Trajano

5
GitHub repo'nuzu doğrudan maven aracılığıyla açığa çıkarmanızı sağlayan bir araç var. jitpack.io stackoverflow.com/a/28483461/3975649
metrimer

1
Github ayrıca maven'i destekleyen bir paket sicil duyurdu. Şu anda herkese açık beta sürümünde: github.com/features/package-registry
Kaan

Yanıtlar:


484

Bulabildiğim en iyi çözüm şu adımlardan oluşur:

  1. mvn-repoMaven eserlerinizi barındırmak için bir şube oluşturun .
  2. Eserlerinizi github'a göndermek için github site-maven-eklentisini kullanın.
  3. Maven'ı uzaktan kumandanızı mvn-repomaven deposu olarak kullanacak şekilde yapılandırın .

Bu yaklaşımı kullanmanın çeşitli faydaları vardır:

  • Maven eserleri kaynağınızdan ayrı olarak adlandırılan ayrı bir dalda mvn-repotutulur, tıpkı github sayfaları olarak adlandırılan ayrı bir dalda tutulur gh-pages(github sayfaları kullanıyorsanız)
  • Önerilen diğer çözümlerden farklı olarak, gh-pagesbunları kullanıyorsanız, sizinle çakışmaz .
  • Konuşlandırma hedefiyle doğal olarak bağlanır, böylece öğrenilecek yeni maven komutları olmaz. Sadece mvn deploynormalde yaptığınız gibi kullanın

Uzak bir maven deposuna yapay nesneleri dağıtmanın tipik yolu kullanmaktır mvn deploy, bu yüzden bu çözüm için bu mekanizmaya yama yapalım.

İlk olarak, maven'e yapay nesneleri hedef dizininizdeki geçici bir hazırlama konumuna dağıtmasını söyleyin. Bunu şu adrese ekleyin 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>

Şimdi koşmayı deneyin mvn clean deploy. Maven deponuzu dağıttığını göreceksiniz target/mvn-repo. Bir sonraki adım, dizini GitHub'a yüklemesini sağlamaktır.

~/.m2/settings.xmlGithub'ın GitHub'a iletebilmesi için kimlik doğrulama bilgilerinizi ekleyin site-maven-plugin:

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

(Belirtildiği gibi, lütfen chmod 700 settings.xmlkimsenin dosyadaki şifrenizi okuyamamasını sağladığınızdan emin olun . Birisi site-maven-eklentisinin bir yapılandırma dosyasında kullanmak yerine bir şifre sormasını nasıl sağlayacağını biliyorsa, bana bildirin.)

Ardından GitHub'a pom'nıza site-maven-pluginaşağıdakileri ekleyerek yeni yapılandırdığınız yeni sunucuyu bildirin :

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

Son olarak, site-maven-plugingeçici sahneleme mvn-repodeposundan Github'daki şubenize yüklenecek şekilde yapılandırın :

<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-repoDal sizin için oluşturulacak, mevcut gerekmez.

Şimdi mvn clean deploytekrar koş . Maven-deploy-plugin'in dosyaları hedef dizindeki yerel hazırlama havuzunuza "yüklediğini", ardından bu dosyaları yürüten ve sunucuya gönderen site-maven-eklentisini görmelisiniz.

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

Tarayıcınızda github.com adresini ziyaret edin, şubeyi seçin mvn-repove tüm ikili dosyalarınızın orada olduğunu doğrulayın.

resim açıklamasını buraya girin

Tebrikler!

Artık maven eserlerinizi sadece koşarak fakir bir adamın halka açık deposuna dağıtabilirsiniz mvn clean deploy.

Atmak isteyeceğiniz bir adım daha var, bu da deponuza bağlı olan pompayı deponuzun nerede olduğunu bilmek için yapılandırmaktır. Projenize bağlı herhangi bir projenin pom'una aşağıdaki snippet'i ekleyin:

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

Şimdi jar dosyalarınızı gerektiren herhangi bir proje onları otomatik olarak github maven deponuzdan indirecektir.

Düzenleme: yorumlarda belirtilen sorunu önlemek için ('İşleme oluşturulurken hata oluştu: Geçersiz istek.' Özellikler / ad 'için nil bir dize değil.'), Github'daki profilinizde bir ad belirttiğinizden emin olun.


25
Ayrıca, bu çözümün her dağıttığınızda önceki eserlerinizin üzerine yazacağını unutmayın. Bu, anlık görüntü depoları için uygundur, ancak serbest bırakılan eserler için uygun değildir. Bu davranışı devre dışı bırakmak <merge>true</merge>için site-maven-eklenti yapılandırmanızda ayarlayın. Eğer bunu yaparsanız, ancak, el ile github içinde mvn-repo şube oluşturmak ve ilk kez etrafında tüm dosyaları silmek zorunda düşünüyorum.
emmby

13
+1 akıllı ve iyi sundu. Benim tek eleştirim Maven eklentileri sitesine bir bağlantı eklememenizdir : github.com/github/maven-plugins . Teşekkürler Maven sitemi github'da yayınlamanın bir yolunu arıyordum!
Mark O'Connor

7
Github'da İki Faktörlü kimlik doğrulama kullanıldığında bu yaklaşım çalışmaz. Buradaki notuma
Dag

18
İçin bu işi yapmak için çok modüllü projelerinin , ayrıca basitçe kullanabilirsiniz <altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository>ile maven-dağıtma-plugin ve <outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>ile site maven-plugin . Bu, tüm eserleri kök ("ebeveyn") projesine yerleştirir ve bunları github'daki ilgili ebeveyn dizinine gönderir. Aksi takdirde, her alt modülün yapısı daha önce inşa edilen alt modülün üzerine yazacaktır ...
sd

7
Çalışmasını sağlayan iki öneri (en azından benim için): Github eklentisinin mevcut sürümünü ayarlayın (şu anda 0.11 olacaktır). Ayrıca herkesin şifre yerine OAUTH jetonu kullanmasını öneririm. 'Ayarlar-> Uygulamalar-> Kişisel Erişim Belirteçleri' bölümünde oluşturabilirsiniz. Daha sonra POM içine satır içi ve token çevre değişkeni olarak saklayabilirsiniz. <github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
Florian Loch

120

GitHub'ı Maven Deposu olarak kullanmayın.

Düzenleme: Bu seçenek aşağı oy bir sürü alır, ama neden hakkında yorum yok. Bu, GitHub'da barındırılabilecek teknik özelliklerden bağımsız olarak doğru seçenektir. GitHub'da barındırma aşağıda belirtilen tüm nedenlerden dolayı yanlıştır ve yorum yapmadan sorunlarınızı açıklığa kavuşturmak için cevabı geliştiremiyorum.

En İyi Seçenek - Orijinal Proje ile İşbirliği Yapın

En iyi seçenek orijinal projeyi değişikliklerinizi dahil etmeye ve orijinaline sadık kalmaya ikna etmektir.

Alternatif - Kendi Çatalınızı Koruyun

Bir açık kaynak kitaplığı çatalladığınızdan ve çatalınız da açık kaynak olduğundan, çatalınızı Maven Central'a yükleyebilirsiniz ( yeni ve belki de yeni bir veri vererek Maven Central'a (Merkezi Depo'ya eserler yükleme kılavuzu) okuyun .groupIdartifactId

Bu seçeneği yalnızca, değişiklikler orijinal projeye dahil edilene kadar bu çatalı korumak istiyorsanız ve bunu terk etmeniz gerekiyorsa düşünün.

Çatalın doğru seçenek olup olmadığını gerçekten düşünün. 'Neden çatallanmıyorsunuz' için sayısız Google sonuçlarını okuyun

muhakeme

Deponuzu kavanozlarla şişirmek, yararsız olarak indirme boyutunu artırır

Bir kavanoz outputprojenizden biridir, projesinden herhangi bir zamanda yeniden oluşturulabilir inputsve GitHub deponuzda yalnızca içerilmesi gerekir inputs.

Bana inanmıyor musunuz? Ardından 'git'te ikili dosyaları saklama' için Google sonuçlarını kontrol edin .

GitHub'ın yardımı Büyük dosyalarla çalışmak size aynı şeyi söyleyecektir. Kuşkusuz jar'ler büyük değil, ancak kaynak koddan daha büyükler ve bir kavanoz bir sürüm tarafından oluşturulduktan sonra, sürümlendirilmeleri için bir nedenleri yok - yeni bir sürümün nedeni budur.

Pom.xml dosyasında birden çok depo tanımlamak, veri havuzunuzun süresine göre yapınızı yavaşlatır.

Stephen Connolly diyor ki :

Eğer bir kişi repo'nuzu eklerse, artık yapıtları kontrol etmek için başka bir repoya sahip oldukları için yapı performanslarını etkilerler ... Sadece bir repo eklemeniz gerekiyorsa büyük bir sorun değil ... Ama sorun büyüyor ve bildiğiniz bir sonraki şey maven build her eser için 50 depo kontrol ediyor ve inşa süresi bir köpektir.

Doğru! Maven, pom.xml dosyasında tanımlanan her eseri (ve bağımlılıklarını) tanımladığınız her Depo'ya karşı kontrol etmelidir , çünkü bu depolardan herhangi birinde daha yeni bir sürüm mevcut olabilir.

Kendiniz deneyin ve yavaş bir yapının acısını hissedeceksiniz.

Eserler için en iyi yer, kavanozlar için merkezi bir yer olduğu için Maven Central'dadır ve bu da yapınızın sadece bir yeri kontrol edeceği anlamına gelir .

Depolar hakkında daha fazla bilgiyi Maven'in Depolara Giriş belgesinde okuyabilirsiniz.


3
Tamamen katılıyorum ve bir süre saklamak istediğiniz çatallar için mantıklı. Ancak bu, mevcut bir projeye yönelik küçük bir yama için çok fazla yük olabilir.
emmby

5
Github'ın bu konuda bir problemi olduğundan şüpheliyim, çünkü bu yeteneği etkinleştiren eklentiyi yazdılar. Kabul ediyorum, fikirden daha az, ama en la vie.
Phy6

4
Sonatype'a açık kaynaklı bir proje uygulamak her zaman mümkün değildir. Örneğin, projeniz halihazırda dağıtılmamış başka bir açık kaynak projesine bağlıysa (ve sonatype gereksinimlerini karşılamadığı için dağıtılamaz).
Gab

1
@Gab o zaman bağımlılığınız gerçekten açık kaynak değil. Diğer proje ile iletişime geçip bunu açıklamalı ve lisanslarını düzeltmelerini sağlamalısınız. (Sun geçmişte bu davranışın suçlusu idi)
Bae

1
@Bae Bu bir lisanslama sorunu değil. Bazı proje sahipleri sadece öncelikleri olmadığı için merkezde yayınlamamaya karar verirler. Gerçek dünyada yolunuz mümkün değil. Test etmek istiyorsanız: Merkezi kod.google.com/p/sd-dss adresinde yayınlamaya ikna edin . AB topluluğu tarafından finanse edilen büyük bir Açık Kaynak projesi :)
Gab

48

Sen kullanabilirsiniz JitPack bir Maven eser olarak sizin GitHub depo ortaya çıkarmak için (kamu Git depoları için ücretsiz). Bu çok kolay. Kullanıcılarınızın bunu pom.xml dosyalarına eklemeleri gerekir:

  1. Havuz ekle:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. Bağımlılık ekle:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

Başka bir yerde yanıtlandığı gibi , JitPack'in GitHub repo'nuzu oluşturacağı ve kavanozlara hizmet edeceği fikri. Gereksinim bir derleme dosyanızın ve GitHub sürümünüzün olması.

Güzel olan şey, dağıtım ve yüklemeleri işlemek zorunda kalmamanızdır. Kendi eser deponuzu korumak istemediğiniz için, ihtiyaçlarınız için iyi bir eşleşme.


JitPack oldukça iyi, ama sizi etrafınızdaki her grubu değiştirmeye zorluyor. Bunun önlenebileceğini söylüyorlar, ancak şirketinizin DNS'sine bir giriş eklemenizi gerektirir, bu da çoğu durumda tamamen pratik değildir. JP ile bir kez denedim, sonra bunun devam etmek için çok aptalca olduğuna karar verdim.
zakmck

1
Projelerinizin groupId değerini değiştirmek gerekli değildir. Bu projeleri yine de 'com.github.User' groupId öğesini kullanarak yükleyebilirsiniz. Ama belki de kullanım durumunuz farklıdır.
Andrejs

Evet, çok fazla. Çünkü zaten organizasyonumun ve harici kullanıcıların çevresinde onlarca tane var ve üzerlerinde kendi markamı istiyorum. Beni kendi grubuna zorlamak için nasıl bu kadar aptal olabilir ki, kariyer değişikliği yapmayı düşündüğüm şeylerden biri.
zakmck

Dahası, JP adamların bana böyle bir gereksinimi atmalarına gerçek bir ihtiyaç görmüyorum (sadece depo spesifikasyonundan Maven isteklerini kesebilirler).
zakmck

1
İyi fikir, yaptım: github.com/jitpack/jitpack.io/issues/209 , teşekkürler :-)
zakmck

9

Başka bir alternatif herhangi bir web webdav desteği ile barındırma kullanmaktır. Bunun için bir yere biraz ihtiyacınız olacak, ancak kurulumu kolay ve tam bir nexus sunucusu çalıştırmak için iyi bir alternatif.

bunu derleme bölümüne ekle

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

Dağıtım yönetiminize böyle bir şey ekleyin

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

Son olarak, ayarlarınıza depo erişimini ayarladığınızdan emin olun. Xml

bunu sunucular bölümüne ekle

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

ve depo bölümünüzün tanımı

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

Son olarak, herhangi bir standart php hosting varsa, webdav yetenekleri eklemek için sabredav gibi bir şey kullanabilirsiniz.

Avantajları: kendi maven deponuz var Downsides: nexus'ta herhangi bir yönetim yeteneğine sahip değilsiniz; bir yerde bir webdav kurulumuna ihtiyacınız var


9

2019'dan beri artık Github paket kayıt defteri adı verilen yeni işlevselliği kullanabilirsiniz .

Temel olarak süreç:

  • github ayarlarından yeni bir kişisel erişim belirteci oluşturma
  • cihazınıza depo ve jeton bilgileri ekleyin settings.xml
  • kullanarak dağıt

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

2019 itibariyle, bu en iyi seçenektir.
HRJ

1
Ancak başka biri tarafından kullanmak için, ilgili URL ve kimlik bilgileriyle settings.xml'yi yapılandırması gerekiyor gibi görünüyor
hemu

Çok garip ... Genel paketinizi oluşturuyorsunuz, ancak başkalarının almadan önce kimlik doğrulamasına ihtiyacı var
Amerousful

Ancak, özel
depolar için

8

Alternatif olarak, Bintray maven depolarının ücretsiz barındırılmasını sağlar. GroupId'i kesinlikle yeniden adlandırmak istemiyorsanız, muhtemelen Sonatype OSS ve Maven Central'a iyi bir alternatiftir . Ancak, lütfen en azından değişikliklerinizin yukarı akışa entegre edilmesini sağlayın veya yeniden adlandırın ve Central'da yayınlayın. Başkalarının çatalınızı kullanmasını çok daha kolay hale getirir.


3
Denediğimde buna inanamadım, ancak Bintray anlık görüntüleri desteklemiyor. Faydasız.
zakmck

6
Artık ücretsiz değil. Ayda 150 dolar.
AndroidDev

Açık kaynaklı yazılım projeleri için ücret olduğunu düşünüyorum: jfrog.com/open-source
iBiber

0

Yalnızca aarveya jardosyanız varsa veya eklentileri kullanmak istemiyorsanız - Basit bir kabuk komut dosyası oluşturdum . Aynı şeyi onunla da yapabilirsiniz - eserlerinizi Github'a yayınlayabilir ve kamu Maven repo olarak kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.