Hosten eines Maven-Repositorys auf Github

312

Ich habe eine Abzweigung einer kleinen Open-Source-Bibliothek, an der ich an Github arbeite. Ich möchte es anderen Entwicklern über maven zur Verfügung stellen, aber ich möchte keinen eigenen Nexus-Server betreiben, und da es sich um eine Abzweigung handelt, kann ich es nicht einfach auf oss.sonatype.org bereitstellen.

Ich möchte es auf Github bereitstellen, damit andere mit Maven darauf zugreifen können. Was ist der beste Weg, dies zu tun?

emmby
quelle
5
Mit welchen Lizenzproblemen sind Sie in OSS Sonatype konfrontiert? Nur neugierig, da ich es selbst benutze.
Archimedes Trajano
5
Es gibt ein Tool, mit dem Sie Ihr GitHub-Repo direkt über maven verfügbar machen können. jitpack.io stackoverflow.com/a/28483461/3975649
metrimer
1
Github kündigte auch eine Paketregistrierung an, die Maven unterstützt. Derzeit in der öffentlichen Beta: github.com/features/package-registry
Kaan

Antworten:

484

Die beste Lösung, die ich finden konnte, besteht aus folgenden Schritten:

  1. Erstellen Sie einen Zweig, der aufgerufen wird mvn-repo, um Ihre Maven-Artefakte zu hosten.
  2. Verwenden Sie das Github Site-Maven-Plugin , um Ihre Artefakte auf Github zu übertragen.
  3. Konfigurieren Sie maven so, dass Ihre Fernbedienung mvn-repoals Maven-Repository verwendet wird.

Dieser Ansatz bietet mehrere Vorteile:

  • Maven-Artefakte werden von Ihrer Quelle in einem separaten Zweig namens getrennt gehalten mvn-repo, ähnlich wie Github-Seiten in einem separaten Zweig namens gh-pages(wenn Sie Github-Seiten verwenden).
  • Im Gegensatz zu einigen anderen vorgeschlagenen Lösungen steht es nicht in Konflikt mit Ihrer, gh-pageswenn Sie sie verwenden.
  • Verbindet sich auf natürliche Weise mit dem Bereitstellungsziel, sodass keine neuen Maven-Befehle zu lernen sind. Verwenden mvn deploySie es einfach wie gewohnt

Die typische Art und Weise, wie Sie Artefakte für ein Remote-Maven-Repo bereitstellen, ist die Verwendung mvn deploy. Lassen Sie uns also diesen Mechanismus für diese Lösung patchen.

Weisen Sie maven zunächst an, Artefakte an einem temporären Staging-Speicherort in Ihrem Zielverzeichnis bereitzustellen. Fügen Sie dies zu Ihrem hinzu 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>

Versuchen Sie jetzt zu laufen mvn clean deploy. Sie werden sehen, dass Ihr Maven-Repository für bereitgestellt wurde target/mvn-repo. Der nächste Schritt besteht darin, das Verzeichnis auf GitHub hochzuladen.

Fügen Sie Ihre Authentifizierungsinformationen hinzu, ~/.m2/settings.xmldamit der Github site-maven-pluginauf GitHub pushen kann:

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

(Wie bereits erwähnt, stellen Sie bitte sicher, chmod 700 settings.xmldass niemand Ihr Passwort in der Datei lesen kann. Wenn jemand weiß, wie das Site-Maven-Plugin ein Passwort auffordert, anstatt es in einer Konfigurationsdatei zu benötigen, lassen Sie es mich wissen.)

Dann informieren Sie den GitHub site-maven-pluginüber den neuen Server, den Sie gerade konfiguriert haben, indem Sie Ihrem POM Folgendes hinzufügen:

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

Konfigurieren Sie abschließend das site-maven-pluginHochladen von Ihrem temporären Staging-Repo in Ihre mvn-repoFiliale auf 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>

Der mvn-repoZweig muss nicht vorhanden sein, er wird für Sie erstellt.

Jetzt mvn clean deploynochmal laufen . Das maven-deploy-plugin sollte die Dateien in Ihr lokales Staging-Repository im Zielverzeichnis "hochladen" und dann das site-maven-plugin diese Dateien festschreiben und auf den Server übertragen.

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

Besuchen Sie github.com in Ihrem Browser, wählen Sie den mvn-repoZweig aus und überprüfen Sie, ob alle Ihre Binärdateien jetzt vorhanden sind.

Geben Sie hier die Bildbeschreibung ein

Herzliche Glückwünsche!

Sie können Ihre Maven-Artefakte jetzt einfach durch Ausführen für das öffentliche Repo eines armen Mannes bereitstellen mvn clean deploy.

Es gibt noch einen weiteren Schritt, den Sie ausführen möchten: Konfigurieren Sie alle Poms, die von Ihrem Pom abhängen, um zu wissen, wo sich Ihr Repository befindet. Fügen Sie dem Pom eines Projekts das folgende Snippet hinzu, das von Ihrem Projekt abhängt:

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

Jetzt werden alle Projekte, für die Ihre JAR-Dateien erforderlich sind, automatisch von Ihrem Github Maven-Repository heruntergeladen.

Bearbeiten: Um das in den Kommentaren erwähnte Problem zu vermeiden ('Fehler beim Erstellen des Commits: Ungültige Anforderung. Für' Eigenschaften / Name 'ist nil keine Zeichenfolge.'), Geben Sie in Ihrem Profil auf github einen Namen an.

emmby
quelle
25
Beachten Sie auch, dass diese Lösung Ihre vorherigen Artefakte bei jeder Bereitstellung überschreibt. Dies ist für Snapshot-Repositorys geeignet, jedoch nicht für freigegebene Artefakte. Um dieses Verhalten zu deaktivieren, legen Sie dies <merge>true</merge>in Ihrer Site-Maven-Plugin-Konfiguration fest. Wenn Sie dies jedoch tun, müssen Sie den Zweig mvn-repo in github manuell erstellen und alle seine Dateien beim ersten Mal löschen.
Emmby
13
+1 klug und gut präsentiert. Mein einziger Kritikpunkt ist, dass Sie keinen Link zur Maven-Plugins-Site eingefügt haben : github.com/github/maven-plugins . Thx Ich suchte nach einer Möglichkeit, meine Maven-Site auf github zu veröffentlichen!
Mark O'Connor
7
Dieser Ansatz funktioniert nicht, wenn die Zwei-Faktor-Authentifizierung für Github verwendet wird. Siehe meine Anmerkung in der Ausgabe hier: github.com/github/maven-plugins/issues/36#issuecomment-31005606
Dag
18
Damit dies für Projekte<altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository> mit mehreren Modulen funktioniert , können Sie es auch einfach mit dem Maven-Deploy-Plugin und <outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>mit dem Site-Maven-Plugin verwenden . Dadurch werden alle Artefakte im Root-Projekt ("übergeordnetes Projekt") bereitgestellt und in das entsprechende übergeordnete Verzeichnis auf Github verschoben. Andernfalls wird die Build jeden Teilmodul , das von dem Submodul vor gebaut überschreiben ...
sd
7
Zwei Vorschläge, die es funktionieren lassen (zumindest für mich): Legen Sie die aktuelle Version des Github-Plugins fest (im Moment wäre es 0.11). Außerdem würde ich jedem empfehlen, anstelle des Passworts ein OAUTH-Token zu verwenden. Sie können es unter 'Einstellungen-> Anwendungen-> Persönliche Zugriffstoken' generieren. Dann können Sie es auch über das Token in das POM einbinden und als Umgebungsvariable speichern. <github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
Florian Loch
120

Verwenden Sie GitHub nicht als Maven-Repository.

Bearbeiten: Diese Option erhält viele Abstimmungen, aber keine Kommentare, warum. Dies ist die richtige Option, unabhängig von den technischen Möglichkeiten, um tatsächlich auf GitHub zu hosten. Das Hosting auf GitHub ist aus allen unten genannten Gründen falsch und ohne Kommentare kann ich die Antwort zur Klärung Ihrer Probleme nicht verbessern.

Beste Option - Arbeiten Sie mit dem Originalprojekt zusammen

Die beste Option ist, das ursprüngliche Projekt davon zu überzeugen, Ihre Änderungen aufzunehmen und beim Original zu bleiben.

Alternative - Pflegen Sie Ihre eigene Gabel

Da Sie eine Open Source-Bibliothek gegabelt haben und Ihre Gabel auch Open Source ist, können Sie Ihre Gabel in Maven Central hochladen (siehe Anleitung zum Hochladen von Artefakten in das Central Repository ), indem Sie ihr eine neue groupIdund möglicherweise eine neue geben artifactId.

Ziehen Sie diese Option nur in Betracht, wenn Sie bereit sind, diese Verzweigung beizubehalten, bis die Änderungen in das ursprüngliche Projekt übernommen wurden, und Sie diese Option dann aufgeben sollten.

Überlegen Sie wirklich genau, ob eine Gabel die richtige Option ist. Lesen Sie die unzähligen Google-Ergebnisse für "Warum nicht gabeln?"

Argumentation

Wenn Sie Ihr Repository mit Gläsern aufblähen, wird die Downloadgröße ohne Nutzen erhöht

Ein JAR gehört outputzu Ihrem Projekt, es kann jederzeit neu generiert werden inputs, und Ihr GitHub-Repo sollte nur enthalten inputs.

Glaubst du mir nicht? Überprüfen Sie dann die Google-Ergebnisse auf "Binärdateien nicht in Git speichern" .

Die Hilfe von GitHub Wenn Sie mit großen Dateien arbeiten , erfahren Sie dasselbe. Zugegeben, JARs sind nicht groß, aber sie sind größer als der Quellcode, und sobald ein JAR durch eine Version erstellt wurde, haben sie keinen Grund, versioniert zu werden - dafür ist eine neue Version gedacht.

Das Definieren mehrerer Repos in Ihrer pom.xml verlangsamt Ihren Build um die Anzahl der Repositorys mal die Anzahl der Artefakte

Stephen Connolly sagt :

Wenn jemand Ihr Repo hinzufügt, wirkt sich dies auf seine Build-Leistung aus, da er jetzt ein anderes Repo hat, mit dem Artefakte verglichen werden können ... Es ist kein großes Problem, wenn Sie nur ein Repo hinzufügen müssen ... Aber das Problem wächst und das nächste, was Sie kennen Maven Build überprüft 50 Repos für jedes Artefakt und die Bauzeit ist ein Hund.

Das stimmt! Maven muss jedes in Ihrer pom.xml definierte Artefakt (und seine Abhängigkeiten) mit jedem von Ihnen definierten Repository vergleichen , da möglicherweise eine neuere Version in einem dieser Repositorys verfügbar ist.

Probieren Sie es selbst aus und Sie werden den Schmerz eines langsamen Aufbaus spüren.

Der beste Ort für Artefakte ist Maven Central, da es der zentrale Ort für Gläser ist. Dies bedeutet, dass Ihr Build immer nur einen Ort überprüft .

Weitere Informationen zu Repositorys finden Sie in der Dokumentation von Maven zur Einführung in Repositorys

Bae
quelle
3
Stimmen Sie voll und ganz zu und machen Sie Sinn für Gabeln, die Sie eine Weile behalten möchten. Dies kann jedoch viel Aufwand für nur einen kleinen Patch für ein vorhandenes Projekt bedeuten.
Emmby
5
Ich bezweifle, dass Github ein Problem damit hat, da sie das Plugin geschrieben haben, das diese Funktion ermöglicht. Ich bin damit einverstanden, dass es weniger als eine Idee ist, aber c'est la vie.
Phy6
4
Es ist nicht immer möglich, ein Open Source-Projekt unter Sonatype bereitzustellen. Wenn Ihr Projekt beispielsweise von einem anderen Open Source-Projekt abhängt, das noch nicht bereitgestellt wurde (und nicht bereitgestellt werden kann, weil es die Sonatypanforderungen nicht erfüllt).
Gab
1
@Gab dann ist deine Abhängigkeit nicht wirklich Open Source. Sie sollten das andere Projekt kontaktieren und dies erklären und sie dazu bringen, ihre Lizenzierung zu korrigieren. (Sonne war ein Schuldiger dieses Verhaltens in der Vergangenheit)
Bae
1
@ Bae Es geht nicht um Lizenzierung. Einige Projektbesitzer entscheiden sich dafür, nicht auf Central zu veröffentlichen, nur weil dies nicht ihre Priorität ist. Dein Weg ist in der realen Welt nicht möglich. Wenn Sie testen möchten: Überzeugen Sie dies von der Veröffentlichung auf Central code.google.com/p/sd-dss . Es ist ein großes Open Source-Projekt, das von der EU-Community finanziert wird :)
Gab
48

Sie können JitPack (kostenlos für öffentliche Git-Repositorys) verwenden, um Ihr GitHub-Repository als Maven-Artefakt verfügbar zu machen . Es ist sehr leicht. Ihre Benutzer müssten dies zu ihrer pom.xml hinzufügen:

  1. Repository hinzufügen:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. Abhängigkeit hinzufügen:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

Wie an anderer Stelle beantwortet , besteht die Idee darin, dass JitPack Ihr GitHub-Repo erstellt und die Gläser bedient. Voraussetzung ist, dass Sie eine Build-Datei und eine GitHub-Version haben.

Das Schöne ist, dass Sie sich nicht um Bereitstellung und Uploads kümmern müssen. Da Sie kein eigenes Artefakt-Repository verwalten wollten, passt es gut zu Ihren Anforderungen.

Andrejs
quelle
JitPack ist ziemlich gut, zwingt Sie jedoch dazu, jede Gruppen-ID zu ändern, die Sie in der Nähe haben. Sie sagen, dass dies vermieden werden kann, aber es erfordert, dass Sie einen Eintrag zum DNS Ihres Unternehmens hinzufügen, was in den meisten Fällen völlig unpraktisch ist. Ich habe es einmal mit JP versucht, dann habe ich entschieden, dass dies zu dumm ist, um fortzufahren.
Zakmck
1
Das Ändern der Gruppen-ID Ihrer Projekte ist nicht erforderlich. Sie können diese Projekte weiterhin mit der Gruppen-ID 'com.github.User' installieren. Aber vielleicht ist Ihr Anwendungsfall anders.
Andrejs
Ja, das ist sehr viel. Weil ich bereits Dutzende von ihnen in meiner Organisation und bei externen Benutzern habe und weil ich meine eigene Marke auf ihnen haben möchte. Wie man so dumm sein kann, mich in seine eigene Gruppe zu zwingen, ist eines der Dinge, warum ich über eine berufliche Veränderung nachdenke.
Zakmck
Außerdem sehe ich keine wirkliche Notwendigkeit für JP-Leute, solche Anforderungen an mich zu stellen (sie könnten einfach Maven-Anfragen aus der Repository-Spezifikation abfangen).
Zakmck
1
Gute Idee, ich habe es geschafft: github.com/jitpack/jitpack.io/issues/209 , danke :-)
zakmck
9

Eine andere Alternative ist die Verwendung eines Webhostings mit Webdav-Unterstützung. Sie werden natürlich irgendwo etwas Platz dafür benötigen, aber es ist einfach einzurichten und eine gute Alternative zum Ausführen eines vollwertigen Nexus-Servers.

Fügen Sie dies Ihrem Build-Bereich hinzu

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

Fügen Sie Ihrem DistributionManagement-Bereich so etwas hinzu

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

Stellen Sie schließlich sicher, dass Sie den Repository-Zugriff in Ihrer settings.xml einrichten

Fügen Sie dies Ihrem Serverbereich hinzu

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

und eine Definition für Ihren Repository-Bereich

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

Wenn Sie ein Standard-PHP-Hosting haben, können Sie so etwas wie Sabredav verwenden, um Webdav-Funktionen hinzuzufügen.

Vorteile: Sie haben Ihr eigenes Maven-Repository. Nachteile: Sie haben keine der Verwaltungsfunktionen in Nexus. Sie benötigen irgendwo ein Webdav-Setup

Jilles van Gurp
quelle
9

Seit 2019 können Sie jetzt die neue Funktionalität namens Github-Paketregistrierung verwenden .

Grundsätzlich ist der Prozess:

  • Generieren Sie aus den Github-Einstellungen ein neues persönliches Zugriffstoken
  • Fügen Sie Repository- und Token-Informationen in Ihre settings.xml
  • Bereitstellen mit

    mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token  
Ruslan López
quelle
Ab 2019 ist dies die beste Option.
HRJ
1
Aber um es von jemand anderem zu verwenden, muss er / sie die
Datei
Sehr seltsam ... Sie erstellen Ihr öffentliches Paket, aber andere Personen benötigen eine Authentifizierung, bevor sie es erhalten
Amerousful
Für private Repos wird jedoch nach der Zertifizierung der Nutzung / Monat die Preisgestaltung angezeigt
Lokeshwar Tailor
8

Als Alternative bietet Bintray das kostenlose Hosting von Maven-Repositories. Dies ist wahrscheinlich eine gute Alternative zu Sonatype OSS und Maven Central, wenn Sie die groupId absolut nicht umbenennen möchten. Aber bitte bemühen Sie sich zumindest, Ihre Änderungen vorab zu integrieren oder umzubenennen und in Central zu veröffentlichen. Es macht es für andere viel einfacher, Ihre Gabel zu benutzen.

Guillaume
quelle
3
Ich konnte es nicht glauben, als ich es versuchte, aber Bintray unterstützt keine Schnappschüsse. Nutzlos.
Zakmck
6
Es ist nicht mehr kostenlos. 150 Dollar im Monat.
AndroidDev
Ich denke, es ist Gebühr für Open-Source-Software-Projekte: jfrog.com/open-source
iBiber
0

Wenn Sie nur aaroder jarDatei selbst haben oder einfach keine Plugins verwenden möchten, habe ich ein einfaches Shell-Skript erstellt . Sie können dasselbe damit erreichen - indem Sie Ihre Artefakte in Github veröffentlichen und als öffentliches Maven-Repo verwenden.

Orest Savchak
quelle