Maven Modul auf GitHub publizieren (GitHub Packages)
Diese Anleitung zeigt, wie ein Java Maven Modul auf GitHub Packages publiziert wird, sodass es in anderen Projekten als Dependency verwendet werden kann.
Schritt 1: Repository auf GitHub erstellen
Als Beispiel dient mylib die als Beispiel unter github.com/prmodulesliegt.
ACHTUNG Das sind Beispielnamen. Sie müssen natürlich Ihren eigenen Repository-Namen und Ihren eigenen GitHub-Account verwenden.
Beispiel der Projektstruktur:
mylib
├ pom.xml
└ src
├ main
│ └ java
└ test
└ java
Schritt 2: pom.xml
Kontrollieren Sie, ob Sie ein ähnliches pom.xml bereits haben.
Achtung: die Versionen nicht einfach 1:1 übernehmen.
Die groupId, artifactId und version müssen eindeutig sein, damit es keine Konflikte gibt.
Und die Version darf kein snapshot sein.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ch.bbw.pr.lib</groupId>
<artifactId>mylib</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
</project>
Schritt 3: GitHub Packages Repository definieren
In der pom.xml hinzufügen:
Wichtig: Sie müssen sicher sein, wie das Git-Repository heisst. Denn daraus leitet sich die URL für das Hochladen des Packages ab.
Beispiel:
Repository: github.com/prmodules/mylib
URL: https://maven.pkg.github.com/prmodules/mylib
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub Packages</name>
<url>https://maven.pkg.github.com/prmodules/mylib</url>
</repository>
</distributionManagement>
Schritt 4: Zugangsdaten konfigurieren
Auf Ihrem Computer in Ihrem User-Verzeichnis in Ihrem lokalen Maven-Repository mussen Sie diese Datei anpassen.
~/.m2/settings.xml
Beispiel:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>github</id>
<username>DEIN_GITHUB_USERNAME</username>
<password>GITHUB_TOKEN</password>
</server>
</servers>
</settings>
Der Token wird in GitHub erstellt:
Settings -> Developer Settings -> Personal Access Token -> Tokens classic -> Generate new token (classic)
Benötigte Scopes:
write:packages
read:packages
Der Token muss wie ein Passwort behandelt werden. Es ist nicht möglich, den Token später nochmal einzusehen. Es lohnt sich den Token in einem sicheren Passwort-Manager zu speichern.
Es lohnt sich den Token in einem Bash-Terminal auszuprobieren
curl -u DEIN_USERNAME https://api.github.com/user
# Und dann Token als Passwort eingeben
# Wenn eine Fehlermeldung erscheint, dann funktioniert die Authentifizierung mit dem Token
Weiter kann man mit Maven prüfen, ob die settings.xml ok ist.
Sie können unter IntelliJ das folgende Maven Target aufrufen.
Schritt 5: Artefakt publizieren
Projekt auf github als Packages publizieren:
mvn deploy
Danach erscheint das Artefakt in Ihrem Repository auf Github unter Packages
Schritt 6: Das Modul in einem anderen Projekt verwenden
Im anderen Projekt die Datei pom.xml ergänzen.
Das Repository hinzufügen (Standardmässig kennt Maven nur das Central Repository)
<repositories>
<repository>
<id>github</id>
<url>https://maven.pkg.github.com/prmodules/mylib</url>
</repository>
</repositories>
Die Dependency hinzufügen:
<dependency>
<groupId>ch.bbw.pr.lib</groupId>
<artifactId>mylib</artifactId>
<version>1.0.0</version>
</dependency>
Und dann die Methode aus dem Module in diesem anderen Projekt aufrufen, um zu zeigen, dass es funktioniert.
Falls Sie Ihr eigenes Modul mylibin Ihrem Projekt aufrufen, so ist es sehr wahrscheinlich, dass mylib bereits in Ihrem lokalen Maven Repository liegt. (Sie haben ja mylib zuvor lokal gebaut und publiziert.)
Um zu prüfen, ob auch der Download von github funktioniert, müssen Sie mylib aus Ihrem lokalen Repository (.m2 ...) löschen.
Allenfalls erkennt dann Maven aber nicht, dass das Package neu geladen werden muss. Hier hilft allenfalls dieser Aufruf, der das Laden erzwingt.
mvn -U -e -DSkipTests package