Maven und lokale JARs: 5 fatale Fehler und ihre Lösung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum "JAR einfach in einen Ordner kopieren" nicht funktioniert?

\n\n

Jeder Java-Entwickler, der sich schon einmal mit Maven beschäftigt hat, stößt früher oder später auf eine Hürde: "Ich muss eine alte Bibliothek einbinden, die es nicht in Maven Central gibt. Was tun?". Sie googeln, finden eine Frage auf Stack Overflow mit tausenden Aufrufen, probieren den ersten Tipp – und erhalten ClassNotFoundException oder Missing artifact.

\n\n

Kommt Ihnen das bekannt vor? In diesem Artikel analysieren wir die Top-Fehler beim Hinzufügen lokaler JAR-Dateien zu einem Maven-Projekt und, was noch wichtiger ist, wie Sie sie vermeiden. Sie lernen nicht nur die Theorie, sondern sehen auch funktionierenden Code, den Sie sofort in Ihrem Java-Projekt anwenden können.

\n\n

Fehler Nr. 1: System scope ohne systemPath

\n\n

Die häufigste Anfängerfalle ist, eine Abhängigkeit mit <scope>system</scope> hinzuzufügen, aber zu vergessen, <systemPath> anzugeben. Maven versucht ehrlich, das JAR zu finden, weiß aber nicht, wo es liegt.

\n\n

Wie der Fehler aussieht

\n
[ERROR] Failed to execute goal on project my-app: \nCould not resolve dependencies for project com.example:my-app:jar:1.0: \nThe following artifacts could not be resolved: \ncom.example:my-custom-lib:jar:1.0 (absent)
\n\n

Falscher Code

\n
<dependency>\n    <groupId>com.example</groupId>\n    <artifactId>my-custom-lib</artifactId>\n    <version>1.0</version>\n    <scope>system</scope>\n    <!-- systemPath fehlt! -->\n</dependency>
\n\n

Richtige Lösung

\n

Geben Sie immer den vollständigen Pfad zur JAR-Datei über <systemPath> an. Verwenden Sie idealerweise einen relativen Pfad vom Projektstammverzeichnis aus, um nicht an einen bestimmten Entwicklerrechner gebunden zu sein.

\n\n
<dependency>\n    <groupId>com.example</groupId>\n    <artifactId>my-custom-lib</artifactId>\n    <version>1.0</version>\n    <scope>system</scope>\n    <systemPath>${project.basedir}/libs/my-custom-lib-1.0.jar</systemPath>\n</dependency>
\n\n

Wichtig: Die JAR-Datei muss im Ordner libs/ innerhalb Ihres Projekts liegen. Erstellen Sie diesen, falls Sie es noch nicht getan haben.

\n\n

Fehler Nr. 2: install-file für Multi-Modul-Projekte vergessen

\n\n

Angenommen, Sie haben ein lokales JAR über system scope hinzugefügt, und alles funktioniert lokal. Aber wenn Sie versuchen, das Projekt auf einem CI-Server (Jenkins, GitLab CI) zu bauen, schlägt der Build fehl. Warum? Weil der system scope nicht transitiv weitergegeben wird und nicht in das lokale Maven-Repository gelangt.

\n\n

Richtiger Ansatz: JAR im lokalen Repository installieren

\n

Verwenden Sie den Befehl mvn install:install-file. Dadurch wird Ihr JAR zu ~/.m2/repository hinzugefügt und ist für alle Module des Projekts und für CI-Builds verfügbar.

\n\n
mvn install:install-file \\\n   -Dfile=libs/my-custom-lib-1.0.jar \\\n   -DgroupId=com.example \\\n   -DartifactId=my-custom-lib \\\n   -Dversion=1.0 \\\n   -Dpackaging=jar \\\n   -DgeneratePom=true
\n\n

Danach können Sie in der pom.xml eine normale Abhängigkeit ohne systemPath angeben:

\n\n
<dependency>\n    <groupId>com.example</groupId>\n    <artifactId>my-custom-lib</artifactId>\n    <version>1.0</version>\n</dependency>
\n\n

Fehler Nr. 3: Verwendung von file:// URLs in Repositories

\n\n

Einige Entwickler versuchen, Maven zu "überlisten", indem sie einen lokalen Ordner als Repository über <repository> mit einer file:// URL hinzufügen. Technisch funktioniert das, erzeugt aber eine Reihe von Problemen:

\n\n
    \n
  • Nicht portabel: Der Pfad /home/user/project/libs funktioniert auf einem anderen Rechner nicht.
  • \n
  • Verwirrung bei Versionen: Es kann zu Konflikten kommen, wenn Sie mehrere Versionen derselben Bibliothek verwalten.
  • \n

Blogs

Buchempfehlungen