Maven2 macht mich während der Experimentier- / schnellen und schmutzigen Modellierungsphase der Entwicklung verrückt.
Ich habe eine pom.xml
Datei, die die Abhängigkeiten für das Web-App-Framework definiert, das ich verwenden möchte, und ich kann schnell Starterprojekte aus dieser Datei generieren. Manchmal möchte ich jedoch eine Verknüpfung zu einer Drittanbieter-Bibliothek herstellen, für die noch keine pom.xml
Datei definiert ist. Anstatt die pom.xml
Datei für die Drittanbieter-Bibliothek von Hand zu erstellen und zu installieren und die Abhängigkeit zu meiner hinzuzufügen pom.xml
, möchte ich nur um Maven zu sagen: "Fügen Sie zusätzlich zu meinen definierten Abhängigkeiten alle Gläser hinzu, die sich ebenfalls befinden /lib
."
Es scheint so, als ob dies einfach sein sollte, aber wenn es so ist, fehlt mir etwas.
Hinweise dazu sind sehr willkommen. Kurz gesagt, wenn es eine einfache Möglichkeit gibt, maven auf ein /lib
Verzeichnis zu verweisen und einfach ein pom.xml
mit allen beiliegenden Gläsern zu erstellen , die einer einzigen Abhängigkeit zugeordnet sind, die ich dann auf einen Schlag benennen / installieren und verknüpfen könnte, würde dies ebenfalls ausreichen.
Antworten:
Probleme populärer Ansätze
Die meisten Antworten, die Sie im Internet finden, empfehlen Ihnen, entweder die Abhängigkeit in Ihrem lokalen Repository zu installieren oder einen "System" -Bereich im anzugeben
pom
und die Abhängigkeit mit der Quelle Ihres Projekts zu verteilen. Beide Lösungen sind jedoch fehlerhaft.Warum Sie den Ansatz "Auf lokalem Repo installieren" nicht anwenden sollten
Wenn Sie eine Abhängigkeit in Ihrem lokalen Repository installieren, bleibt diese dort. Ihr Distributionsartefakt funktioniert einwandfrei, solange es Zugriff auf dieses Repository hat. Das Problem ist, dass sich dieses Repository in den meisten Fällen auf Ihrem lokalen Computer befindet. Daher gibt es keine Möglichkeit, diese Abhängigkeit von einem anderen Computer aufzulösen. Es ist keine Möglichkeit, Ihr Artefakt von einer bestimmten Maschine abhängig zu machen. Andernfalls muss diese Abhängigkeit lokal auf jedem Computer installiert werden, der mit diesem Projekt arbeitet, was nicht besser ist.
Warum Sie den "System Scope" -Ansatz nicht anwenden sollten
Die Jars, auf die Sie beim "System Scope" -Ansatz angewiesen sind, werden weder in einem Repository installiert noch an Ihre Zielpakete angehängt. Aus diesem Grund kann Ihr Distributionspaket diese Abhängigkeit bei Verwendung nicht auflösen. Ich glaube, das war der Grund, warum die Nutzung des Systemumfangs sogar veraltet war. Auf jeden Fall möchten Sie sich nicht auf eine veraltete Funktion verlassen.
Die statische In-Project-Repository-Lösung
Nachdem Sie dies in Ihre
pom
:Für jedes Artefakt mit einer Gruppen-ID des Formulars nimmt
x.y.z
Maven bei der Suche nach Artefakten den folgenden Speicherort in Ihrem Projektverzeichnis auf:Um mehr darüber zu erfahren, können Sie diesen Blog-Beitrag lesen .
Verwenden Sie Maven, um das Projekt-Repo zu installieren
Anstatt diese Struktur von Hand zu erstellen, empfehle ich, ein Maven-Plugin zu verwenden, um Ihre Gläser als Artefakte zu installieren. Um ein Artefakt in einem projektinternen Repository unter
repo
Ordner zu installieren, führen Sie Folgendes aus:Wenn Sie diesen Ansatz wählen, können Sie die Repository-Deklaration vereinfachen in
pom
:Ein Hilfsskript
Da das Ausführen des Installationsbefehls für jede Bibliothek etwas ärgerlich und definitiv fehleranfällig ist, habe ich ein Dienstprogramm-Skript erstellt, das automatisch alle Jars aus einem
lib
Ordner in ein Projekt-Repository installiert und gleichzeitig alle Metadaten (groupId, artefaktId usw.) von automatisch auflöst Namen von Dateien. Das Skript druckt auch die XML-Abhängigkeiten aus, die Sie kopieren und in Ihre einfügen könnenpom
.Fügen Sie die Abhängigkeiten in Ihr Zielpaket ein
Wenn Sie Ihr projektinternes Repository erstellt haben, haben Sie ein Problem beim Verteilen der Abhängigkeiten des Projekts mit seiner Quelle gelöst. Seitdem hängt das Zielartefakt Ihres Projekts jedoch von nicht veröffentlichten Jars ab es zu einem Repository wird es unlösbare Abhängigkeiten haben.
Um dieses Problem zu lösen, schlage ich vor, diese Abhängigkeiten in Ihr Zielpaket aufzunehmen. Dies können Sie entweder mit dem Assembly Plugin oder besser mit dem OneJar Plugin tun . Die offizielle Dokumentation zu OneJar ist leicht zu verstehen.
quelle
Nur zum Wegwerfen von Code
Legen Sie scope == system fest und erstellen Sie einfach eine groupId, eine Artefakt-ID und eine Version
Hinweis: Systemabhängigkeiten werden nicht in das resultierende jar / war kopiert
(siehe So schließen Sie Systemabhängigkeiten in War ein, die mit maven erstellt wurden ).
quelle
system
Oszilloskops eine schreckliche Praxis ist, von der dringend abgeraten wird . Siehe Abhängigkeit + Bereiche .Sie können ein lokales Repository für Ihr Projekt erstellen
Zum Beispiel, wenn Sie einen
libs
Ordner in der Projektstruktur habenIm
libs
Ordner sollten Sie eine Verzeichnisstruktur erstellen wie:/groupId/artifactId/version/artifactId-version.jar
In Ihrer pom.xml sollten Sie das Repository registrieren
und fügen Sie die Abhängigkeit wie gewohnt hinzu
Das ist alles.
Ausführliche Informationen: Hinzufügen externer Bibliotheken in Maven
quelle
Hinweis: Bei Verwendung des Systembereichs ( wie auf dieser Seite erwähnt ) benötigt Maven absolute Pfade.
Wenn sich Ihre Jars im Stammverzeichnis Ihres Projekts befinden, sollten Sie Ihren systemPath-Werten $ {basedir} voranstellen.
quelle
Dies ist, was ich getan habe, es funktioniert auch um das Paketproblem und es funktioniert mit ausgechecktem Code.
Ich habe in meinem Fall einen neuen Ordner im Projekt erstellt
repo
, kann ihn aber gerne verwendensrc/repo
In meinem POM hatte ich eine Abhängigkeit, die sich in keinem öffentlichen Maven-Repository befindet
Ich habe dann die folgenden Verzeichnisse erstellt
repo/com/dovetail/zoslog4j/1.0.1
und die JAR-Datei in diesen Ordner kopiert.Ich habe die folgende POM-Datei erstellt, um die heruntergeladene Datei darzustellen (dieser Schritt ist optional, entfernt jedoch eine WARNUNG) und hilft dem nächsten, herauszufinden, woher ich die Datei habe.
Zwei optionale Dateien, die ich erstelle, sind die SHA1-Prüfsummen für das POM und die JAR, um die fehlenden Prüfsummenwarnungen zu entfernen.
Schließlich füge ich meiner pom.xml das folgende Fragment hinzu, mit dem ich auf das lokale Repository verweisen kann
quelle
Sie sollten wirklich ein Framework über ein Repository einrichten und Ihre Abhängigkeiten im Voraus identifizieren. Die Verwendung des Systembereichs ist ein häufiger Fehler, den Benutzer verwenden, weil sie sich "nicht um das Abhängigkeitsmanagement kümmern". Das Problem ist, dass Sie dabei einen perversen Maven-Build erhalten, der Maven in einem normalen Zustand nicht anzeigt. Sie wäre besser dran , wie ein Ansatz folgt dies .
quelle
So fügen wir ein lokales Glas hinzu oder installieren es
Ich gab einige Standard-GroupId und ArtefaktId, weil sie obligatorisch sind :)
quelle
Das Maven-Installations-Plugin verwendet die Befehlszeile, um ein JAR im lokalen Repository zu installieren. POM ist optional, Sie müssen jedoch die GroupId, ArtifactId, Version und Packaging (alle POM-Elemente) angeben.
quelle
Die Verwendung
<scope>system</scope>
ist aus Gründen, die von anderen erklärt wurden, eine schreckliche Idee. Die manuelle Installation der Datei in Ihrem lokalen Repository macht den Build nicht reproduzierbar, und die Verwendung<url>file://${project.basedir}/repo</url>
ist auch keine gute Idee, da (1) dies möglicherweise keine wohlgeformtefile
URL ist (z. B. wenn das Projekt wird in einem Verzeichnis mit ungewöhnlichen Zeichen ausgecheckt), (2) das Ergebnis ist unbrauchbar, wenn der POM dieses Projekts als Abhängigkeit vom Projekt eines anderen verwendet wird.Angenommen, Sie möchten das Artefakt nicht in ein öffentliches Repository hochladen, erledigt Simeons Vorschlag für ein Hilfsmodul die Aufgabe. Aber jetzt gibt es einen einfacheren Weg…
Die Empfehlung
Verwenden Sie das Non-Maven-Jar-Maven-Plugin . Tut genau das, wonach Sie gefragt haben, ohne die Nachteile der anderen Ansätze.
quelle
Ich habe einen anderen Weg gefunden, dies zu sehen, siehe hier aus einem Heroku-Beitrag
Zusammenfassend (Entschuldigung für das Kopieren und Einfügen)
repo
Verzeichnis unter Ihrem Stammordner:pom.xml
:quelle
Nachdem sie wirklich lange mit CloudBees-Leuten über die ordnungsgemäße Verpackung solcher JARs gesprochen hatten, machten sie einen interessanten guten Vorschlag für eine Lösung:
Erstellung eines gefälschten Maven-Projekts, das eine bereits vorhandene JAR als primäres Artefakt anfügt und auf die zugehörige POM-Installation: Installation der Installationsdatei stößt. Hier ist ein Beispiel für eine solche Verwandtschaft von POM:
Um dies umzusetzen, sollte die bestehende Projektstruktur geändert werden. Zunächst sollten Sie bedenken, dass für jede solche Art von JAR ein anderes gefälschtes Maven-Projekt (Modul) erstellt werden sollte. Außerdem sollte ein übergeordnetes Maven-Projekt erstellt werden, das alle Untermodule enthält: alle JAR-Wrapper und das vorhandene Hauptprojekt. Die Struktur könnte sein:
Wenn ein übergeordnetes Element ausgeführt wird, das über mvn: install oder mvn: package ausgeführt wird, werden Submodule ausgeführt. Dies könnte hier als Minus angesehen werden, da die Projektstruktur geändert werden sollte, aber am Ende eine nicht statische Lösung bietet
quelle
Was mir am einfachsten erscheint, ist einfach Ihr Maven-Compiler-Plugin so zu konfigurieren, dass es Ihre benutzerdefinierten Jars enthält. In diesem Beispiel werden alle JAR-Dateien in ein lib-Verzeichnis geladen.
quelle
says nothing to complile
!all classes are up to date
nothing to compile
weil es nicht*.java
mehr sucht . Sie können sie mit wieder hinzufügen<include>**/*.java</include>
. Noch kein Erfolg für mich für die GläserDas Problem dabei
systemPath
ist, dass die Gläser der Abhängigkeiten nicht als transitive Abhängigkeiten entlang Ihrer Artefakte verteilt werden. Versuchen Sie, was ich hier gepostet habe: Ist es am besten, Ihre Projekt-JAR-Dateien zu mavenisieren oder in WEB-INF / lib abzulegen?Deklarieren Sie dann wie gewohnt Abhängigkeiten.
Und bitte lesen Sie die Fußzeile.
quelle
Eine seltsame Lösung, die ich gefunden habe:
mit Eclipse
Prost, Balint
quelle
Wenn Sie eine schnelle und schmutzige Lösung wünschen, können Sie Folgendes tun (obwohl ich dies nur für Testprojekte empfehle, wird sich maven ausführlich darüber beschweren, dass dies nicht richtig ist).
Fügen Sie für jede benötigte JAR-Datei einen Abhängigkeitseintrag hinzu, vorzugsweise mit einem Perl-Skript oder ähnlichem, und kopieren Sie diesen in Ihre POM-Datei.
quelle
Eine schnelle und schmutzige Batch-Lösung (basierend auf Alex 'Antwort):
libs.bat
Führen Sie es folgendermaßen aus :
libs.bat > libs.txt
. Öffnen Sie dannlibs.txt
den Inhalt und kopieren Sie ihn als Abhängigkeiten.In meinem Fall brauchte ich nur die Bibliotheken, um meinen Code zu kompilieren, und diese Lösung war die beste für diesen Zweck.
quelle
Auch wenn es nicht genau zu Ihrem Problem passt, werde ich dies hier fallen lassen. Meine Anforderungen waren:
Lassen Sie uns zuerst über (3) sprechen: Nur die Gläser in einem Ordner zu haben und sie irgendwie in das endgültige Glas zu verschmelzen, funktioniert hier nicht, da die IDE dies nicht versteht. Dies bedeutet, dass alle Bibliotheken ordnungsgemäß installiert werden müssen. Ich möchte jedoch nicht, dass jeder es mit "mvn install-file" installiert.
In meinem Projekt brauchte ich Metawidget. Auf geht's:
Jedes Mal, wenn Sie eine neue Bibliothek haben, fügen Sie einfach eine neue Ausführung hinzu und fordern Sie alle auf, das Projekt erneut zu erstellen (Sie können diesen Prozess mit Projekthierarchien verbessern).
quelle
Verwenden Sie das maven-install-plugin, um das JAR eines Drittanbieters zu installieren, das sich nicht im Maven-Repository befindet.
Unten sind Schritte:
Unten ist das Beispiel, das ich für simonsite log4j verwendet habe
Fügen Sie in die pom.xml die Abhängigkeit wie folgt ein
Führen Sie den Befehl mvn clean install aus, um Ihre Verpackung zu erstellen
Unten ist der Referenzlink:
https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
quelle
Für diejenigen, die hier keine gute Antwort gefunden haben, ist dies das, was wir tun, um ein Glas mit allen notwendigen Abhängigkeiten zu erhalten. In dieser Antwort ( https://stackoverflow.com/a/7623805/1084306 ) wird die Verwendung des Maven Assembly-Plugins erwähnt, die Antwort enthält jedoch kein Beispiel. Und wenn Sie nicht bis zum Ende der Antwort lesen (es ist ziemlich lang), können Sie es verpassen. Wenn Sie das Folgende zu Ihrer pom.xml hinzufügen, wird dies generiert
target/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar
quelle
Ich habe in einem Kommentar zur Antwort von @alex lehmann auf einen Python-Code angespielt, also poste ich ihn hier.
quelle
Dies beantwortet nicht, wie Sie sie zu Ihrem POM hinzufügen können, und ist möglicherweise ein Kinderspiel, würde aber nur das lib-Verzeichnis zu Ihrer Klassenpfadarbeit hinzufügen? Ich weiß, dass ich das tue, wenn ich ein externes Glas brauche, das ich meinen Maven-Repos nicht hinzufügen möchte.
Hoffe das hilft.
quelle
Was in unserem Projekt funktioniert, ist das, was Archimedes Trajano geschrieben hat, aber wir hatten in unserer .m2 / settings.xml so etwas:
und das * sollte auf zentral geändert werden. Wenn seine Antwort für Sie nicht funktioniert, sollten Sie Ihre settings.xml überprüfen
quelle
Ich wollte nur eine schnelle und schmutzige Problemumgehung ... Ich konnte das Skript nicht von Nikita Volkov ausführen: Syntaxfehler + Es erfordert ein striktes Format für die JAR-Namen.
Ich habe dieses Perl-Skript erstellt, das mit jedem Format für die JAR-Dateinamen funktioniert und die Abhängigkeiten in einer XML-Datei generiert, damit es direkt in einen POM eingefügt werden kann.
Wenn Sie es verwenden möchten, stellen Sie sicher , dass Sie verstehen , was das Skript tut, müssen Sie die Änderungen
lib
Ordner und den Wert für diegroupId
oderartifactId
...quelle
Die Lösung für den Ansatz scope = 'system' in Java:
quelle