Maven: Wie kann man Gläser, die nicht in Wiederholungen verfügbar sind, in ein J2EE-Projekt aufnehmen?

100

In meinem J2EE-Projekt habe ich einige Abhängigkeiten, die in keinem Maven-Repository verfügbar sind, da es sich um proprietäre Bibliotheken handelt. Diese Bibliotheken müssen zur Laufzeit verfügbar sein, damit sie in das Ziel /.../ WEB-INF / lib ... kopiert werden können.

Im Moment liste ich sie als Systemabhängigkeit in meinem POM auf, aber bei dieser Methode besteht das Problem darin, dass sie während der Kompilierung nicht in den Zielbuild kopiert werden. Auch diese Methode ist nicht sehr elegant.

Was ist der beste Weg, um sie in Maven zu integrieren?

Hinweis: Ich möchte kein eigenes Maven-Repository erstellen.

Samson
quelle
7
Ich denke wirklich , Sie sollten Ihre Entscheidung, ein Maven-Repository zu erstellen, überprüfen. Es ist überhaupt nicht schwer und 100% wert.
Robert Munteanu
7
Der Wert der Erstellung eines Maven-Repositorys hängt von den Umständen ab.
Yincrash

Antworten:

54

Wie Sie bereits gesagt haben, möchten Sie kein eigenes Repository einrichten. Vielleicht hilft dies.

Sie können das Ziel der Installationsdatei des maven-install-plugins verwenden, um eine Datei im lokalen Repository zu installieren. Wenn Sie für jede Datei ein Skript mit einem Maven-Aufruf erstellen und neben den Jars aufbewahren, können Sie (und alle anderen Benutzer mit Zugriff) die Jars (und die zugehörigen POM-Dateien) problemlos in ihrem lokalen Repository installieren.

Beispielsweise:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

oder nur

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

Sie können dann wie gewohnt auf die Abhängigkeiten in Ihrem Projekt verweisen.

Am besten richten Sie jedoch ein internes Remote-Repository ein, und ich würde empfehlen, Nexus selbst zu verwenden. Es kann bei Bedarf auf Ihrer Entwicklungsbox ausgeführt werden, und der Overhead ist minimal.

Reicher Verkäufer
quelle
1
Danke, diese Methode funktioniert jetzt gut für mich. Ich erweiterte die POM , so dass Dateien automatisch auf dem lokalen rep installiert werden: pastebin.ca/1504318
samson
Ich bin froh zu helfen, aber wie andere gesagt haben, wäre der beste Ansatz, einen Maven-Repository-Manager zu verwenden. Dieser Ansatz lässt sich nicht gut skalieren.
Rich Seller
4
Der Befehl, der für mich funktioniert hat: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick
192

Für Leute, die eine schnelle Lösung für dieses Problem suchen:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

Geben Sie Ihrer Bibliothek einfach eine eindeutige Gruppen-ID und einen eindeutigen Artefaktnamen und zeigen Sie darauf, wo sie sich im Dateisystem befindet. Du bist startklar.

Natürlich ist dies eine schmutzige Schnellkorrektur, die NUR auf Ihrem Computer funktioniert und wenn Sie den Pfad zu den Bibliotheken nicht ändern. Aber manchmal ist das alles, was Sie wollen, um ein paar Tests durchzuführen.

BEARBEITEN: Stellen Sie die Frage einfach erneut und stellen Sie fest, dass der Benutzer meine Lösung bereits als vorübergehende Lösung verwendet hat. Ich werde meine Antwort als schnelle Hilfe für andere hinterlassen, die zu dieser Frage kommen. Wenn jemand damit nicht einverstanden ist, hinterlasse mir bitte einen Kommentar. :) :)

Ric Jafe
quelle
4
Cool. Gibt es eine Möglichkeit, eine URL anstelle eines lokalen Computerpfads anzugeben?
Phreakhead
3
Vielen Dank für ein vollständiges und funktionierendes Beispiel !!! Ich hoffe du fängst einen Goldfisch und er gewährt dir drei Wünsche. :)
Johndodo
14
Dies sollte die akzeptierte Antwort sein, da sie in sich geschlossen ist (in pom.xml)
Vikram
2
Hallo Rajarshee, die Gruppen- und Artefakt-IDs sind völlig willkürlich. Der Pfad zu Ihrem JAR im Dateisystem ist alles, was dafür erforderlich ist. Da das Glas in Wirklichkeit keine Maven-Abhängigkeit ist, fordern Sie Maven nur auf, es wie eine zu behandeln.
Ric Jafe
1
Ab 2016 scheint dies nicht zu funktionieren. Der Build bestätigt den Pfad, enthält jedoch nicht den Code im schattierten Glas. Ratten ...
markthegrea
24

Erstellen Sie einen Repository-Ordner unter Ihrem Projekt. Lass uns nehmen

${project.basedir}/src/main/resources/repo

Installieren Sie dann Ihr benutzerdefiniertes Glas in diesem Repo:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Zuletzt fügen Sie den Projekten pom.xml die folgenden Repo- und Abhängigkeitsdefinitionen hinzu:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>
Mostar
quelle
1
Das hat bei mir sehr gut funktioniert. PS Ich würde ein anderes Verzeichnis für das lokale Repo empfehlen, da es nicht richtig schien, es in "src" zu setzen (es ist keine Quelle!)
davidfrancis
1
Es funktionierte wie ein Zauber. Ich migriere ein altes Projekt von Ant nach Maven und es gibt einige Bibliotheken, die ich in Web-Repos nicht finden kann.
Paulo Pedroso
Achtung: Wenn der Wert für -DlocalRepositoryPath nicht auf endet /(dh einen Ordner angibt), wird das Repo mit groupId erstellt. Beispiel: Wenn die Gruppen-ID foo.comund localRepositoryPath lautet repo, wird der Repo-Ordner repo.foo.com.
Sheshadri Mantha
Diese Prozedur ist ein lokales Projekt für die System-Repository-Verwaltung mit dem Maven Build-Automatisierungstool, das hauptsächlich für Java-Projekte und das Dateisystem verwendet wird.
Oleksii Kyslytsyn
8

Sie müssen ein lokales Repository einrichten, in dem solche Bibliotheken gehostet werden. Es gibt eine Reihe von Projekten, die genau das tun. Zum Beispiel Artifactory .

Gregory Mostizky
quelle
4
Ein Punkt in der Terminologie: Dies sind interne Remote-Repositorys, keine lokalen Repositorys. Das lokale Repository ist dasjenige, in das die Abhängigkeiten des lokalen Dateisystems heruntergeladen werden.
Rich Seller
3

Keine der Lösungen funktioniert, wenn Sie Jenkins Build verwenden !! Wenn pom auf dem Jenkins-Buildserver ausgeführt wird, schlagen diese Lösungen fehl, da Jenkins pom versucht, diese Dateien aus dem Unternehmensrepository herunterzuladen.

Kopieren Sie die Jars unter src / main / resources / lib (erstellen Sie den lib-Ordner). Diese sind Teil Ihres Projekts und reichen bis zum Bereitstellungsserver. Stellen Sie auf dem Bereitstellungsserver sicher, dass Ihre Startskripts src / main / resources / lib / * im Klassenpfad enthalten. Viola.

Apurva Singh
quelle
2

Sie können sie in einem privaten, lokalen Repository installieren (z. B. .m2 / Repository in Ihrem Home-Verzeichnis): Weitere Details finden Sie hier

dfa
quelle
7
Ja, das könnte ich tun, aber dann müsste ich jedem, der das Projekt erstellen möchte, sagen, dass er die Dateien X, Y in Verzeichnis Z ablegen muss, was die Dinge wirklich kompliziert. Schließlich möchte ich Maven verwenden, um den Erstellungsprozess zu vereinfachen.
Samson
2

Wenn ich gut verstehe, dass Sie Abhängigkeiten während der Kompilierungsphase exportieren möchten, damit Sie nicht alle benötigten Bibliotheken manuell abrufen müssen, können Sie das Mojo verwenden -Kopierabhängigkeiten verwenden .

Hoffe, es kann in Ihrem Fall nützlich sein ( Beispiele )

Erik Clairiot
quelle
2

Die Lösung von @Ric Jafe hat bei mir funktioniert.

Genau das habe ich gesucht. Eine Möglichkeit, es für Forschungstestcode durchzusetzen. Nichts Besonderes. Ja, ich weiß, dass das alle sagen :) Die verschiedenen Maven-Plugin-Lösungen scheinen für meine Zwecke übertrieben zu sein. Ich habe einige Gläser, die mir als Drittanbieter-Bibliotheken mit einer POM-Datei übergeben wurden. Ich möchte, dass es schnell kompiliert / ausgeführt wird. Diese Lösung, die ich trivial an Python angepasst habe, hat für mich Wunder gewirkt. Ausschneiden und in meinen Pom kleben. Python / Perl-Code für diese Aufgabe finden Sie in den folgenden Fragen und Antworten : Kann ich Javen zu Maven 2 Build Classpath hinzufügen, ohne sie zu installieren?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1
Paul
quelle
Die obige Lösung gibt 'dependencies.dependency.systemPath' für xx.jar zurück und sollte nicht auf Dateien im Projektverzeichnis verweisen. Siehe stackoverflow.com/questions/10935135/…
sarah.ferguson
1

Die Installation alleine hat bei mir nicht funktioniert.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Jonathan Hendler
quelle