Warum "JAR einfach in einen Ordner kopieren" nicht funktioniert?
\n\nJeder 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.
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\nFehler Nr. 1: System scope ohne systemPath
\n\nDie 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.
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\nFalscher 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\nRichtige Lösung
\nGeben 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.
<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\nWichtig: Die JAR-Datei muss im Ordner libs/ innerhalb Ihres Projekts liegen. Erstellen Sie diesen, falls Sie es noch nicht getan haben.
Fehler Nr. 2: install-file für Multi-Modul-Projekte vergessen
\n\nAngenommen, 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.
Richtiger Ansatz: JAR im lokalen Repository installieren
\nVerwenden 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.
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\nDanach können Sie in der pom.xml eine normale Abhängigkeit ohne systemPath angeben:
<dependency>\n <groupId>com.example</groupId>\n <artifactId>my-custom-lib</artifactId>\n <version>1.0</version>\n</dependency>\n\nFehler Nr. 3: Verwendung von file:// URLs in Repositories
\n\nEinige 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
- Nicht portabel: Der Pfad
/home/user/project/libsfunktioniert auf einem anderen Rechner nicht. \n - Verwirrung bei Versionen: Es kann zu Konflikten kommen, wenn Sie mehrere Versionen derselben Bibliothek verwalten. \n