2009-07-22 13 views
87

in meinem J2EE-Projekt Ich habe ein paar Abhängigkeiten, die in keinem Maven-Repository verfügbar sind, weil sie proprietäre Bibliotheken sind. Diese Bibliotheken müssen zur Laufzeit verfügbar sein, damit sie in das Ziel /.../ WEB-INF/lib ...Maven: Wie kann man Jars, die nicht in Reps vorhanden sind, in ein J2EE-Projekt einbinden?

kopiert werden müssen Ich listet sie gerade als Systemabhängigkeit in meinem POM auf, aber Bei dieser Methode besteht das Problem, dass beim Kompilieren nicht in den Ziel-Build kopiert wird. Auch diese Methode ist nicht sehr elegant.

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

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

+7

Ich denke _really_ Sie sollten Ihre Entscheidung über die Erstellung eines Maven-Repository überprüfen. Es ist überhaupt nicht schwer und 100% wert. –

+7

Der Wert zum Erstellen eines Maven-Repositorys hängt von den Umständen ab. – yincrash

+1

mögliches Duplikat von [Kann ich jars zu maven 2 hinzufügen classepath hinzufügen, ohne sie zu installieren?] (Http://stackoverflow.com/questions/364114/can-i-add-jars-to-maven-2-build-classpath- ohne sie zu installieren) –

Antwort

51

nützlich sein, wie Sie Sie Ihr eigenes Repository einrichten nicht gesagt haben will, vielleicht wird dies dazu beitragen.

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

Zum Beispiel:

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 die Abhängigkeiten wie gewohnt in Ihrem Projekt verweisen.

Aber Ihre beste Wette ist immer noch ein internes Remote-Repository einzurichten und ich würde empfehlen, selbst Nexus zu verwenden. Es kann bei Bedarf auf Ihrer Entwicklungsumgebung ausgeführt werden und der Overhead ist minimal.

+1

Dank dieser Methode funktioniert jetzt gut für mich. Ich erweiterte das POM, so dass Dateien automatisch auf dem lokalen Rep installiert werden: http://pastebin.ca/1504318 – samson

+0

Froh, zu helfen, aber wie andere gesagt haben, wäre der beste Ansatz, einen Maven-Repository-Manager zu verwenden. Dieser Ansatz ist nicht gut skalierbar. –

+4

Der Befehl, der für mich funktionierte: "mvn install: installationsdatei -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1. 1 -Verpackung = Glas " – Mazrick

2

Sie können sie in einem privaten, lokalen Repository installieren (zum Beispiel .m2/Repository unter Ihrem Home-Verzeichnis): more details here

+6

Ja, ich könnte das tun, aber dann müsste ich jedem sagen, der das Projekt erstellen will, dass er die Dateien X, Y in das Verzeichnis Z legt und das die Dinge wirklich kompliziert. Schließlich möchte ich Maven verwenden, um den Build-Prozess zu vereinfachen. – samson

8

Sie benötigen ein lokales Repository einzurichten, die solche Bibliotheken beherbergen wird. Es gibt eine Reihe von Projekten, die genau das tun. Zum Beispiel Artifactory.

+4

Auch Archiv: http://archiva.apache.org/ – teabot

+4

Und Nexus: http://nexus.sonatype.org/ – teabot

+4

Ein Punkt auf Terminologie, das sind interne Remote-Repositories, nicht lokale Repositories. Das lokale Repository ist das, auf das lokale Dateisystemabhängigkeiten heruntergeladen werden. –

2

Wenn ich gut verstehe, wenn Sie wollen, Abhängigkeiten während der Kompilierungsphase zu exportieren, so dass es nicht notwendig sein wird, manuell alle benötigten Bibliotheken abzurufen, können Sie das mojo copy-dependencies verwenden.

Hoffe, es kann in Ihrem Fall (examples)

172

Für Menschen eines Wunsch schnelle Lösung für dieses Problem:

<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> 

nur geben Ihrer Bibliothek ein einzigartiges groupID und Artefakt Namen und zeigen auf, wo es im Dateisystem ist. Du bist startklar.

Natürlich ist dies eine schmutzige schnelle Lösung, die nur auf Ihrem Rechner funktioniert und wenn Sie den Pfad zu den Bibliotheken nicht ändern. Aber manchmal ist das alles, was Sie wollen, um ein paar Tests zu machen.

EDIT: nur die Frage red-red und erkannte, dass der Benutzer meine Lösung bereits als temporäre Lösung verwendet. Ich werde meine Antwort als schnelle Hilfe für andere, die zu dieser Frage kommen, hinterlassen. Wenn jemand damit nicht einverstanden ist, hinterlasse mir einen Kommentar. :)

+4

Cool. Gibt es eine Möglichkeit, eine URL anstelle eines lokalen Maschinenpfads anzugeben? – phreakhead

+3

Vielen Dank für ein komplettes und funktionierendes Beispiel !!! Ich hoffe du fängst einen Goldfisch und es gibt dir drei Wünsche. :) – johndodo

+11

Dies sollte die akzeptierte Antwort sein, da es in sich abgeschlossen ist (in pom.xml) – Vikram

1

Installieren Sie allein nicht für mich arbeiten.

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 
1

@Ric Jafes Lösung ist, was für mich arbeitete.

Das ist genau das, was ich gesucht habe. Eine Möglichkeit, den Testcode für die Forschung durchzusetzen. Nichts Außergewöhnliches. 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 3rd-Party-Bibliotheken mit einer Pom-Datei gegeben wurden. Ich möchte, dass es schnell kompiliert/ausgeführt wird. Diese Lösung, die ich trivialerweise an Python anpasste, wirkte Wunder für mich. Schnitt und klebte in meinen Pom. Python/Perl-Code für diese Aufgabe ist in diesem Q & A: Can I add jars to maven 2 build classpath without installing them?

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 
+0

Die obige Lösung returns 'dependencies.dependency.systemPath' für xx.jar sollte nicht auf Dateien im Projektverzeichnis zeigen. Siehe http://stackoverflow.com/questions/10935135/maven-and-adding-jars-to-system-scope –

16

ein Repository-Ordner unter Ihrem Projekt erstellen. Lassen Sie uns

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

nehmen Installieren Sie dann Ihre benutzerdefinierte jar zu diesem Repo:

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

Schließlich fügen Sie die folgenden Repo- und Abhängigkeitsdefinitionen zu den Projekten pom.xml:

<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> 
+0

Das funktionierte sehr gut für mich. PS Ich würde ein anderes Verzeichnis für das lokale Repo empfehlen, wie es in "src" zu setzen schien nicht richtig (es ist keine Quelle!) – davidfrancis

+0

Es funktionierte wie ein Charme. Ich migriere ein altes Projekt von Ant nach Maven und es gibt einige Bibliotheken, die ich nicht in Web Repos finden kann. –

+0

Vorsicht: Wenn der Wert für -DlocalRepositoryPath nicht in '/' endet (d. H. Einen Ordner angibt), wird er Repo mit groupId erstellt. Bsp .: Wenn die Gruppen-ID "foo.com" und der lokale Repository-Pfad "Repo" ist, wird der Repo-Ordner zu "repo.foo.com". –

0

None der Lösungen funktionieren, wenn Sie Jenkins bauen !! Wenn Pom im Jenkins Build Server ausgeführt wird, werden diese Lösungen fehlschlagen, da Jenkins run pom versucht, diese Dateien aus dem Enterprise Repository herunterzuladen.

Kopieren Sie die Dateien unter src/main/resources/lib (create lib-Ordner). Diese sind Teil Ihres Projekts und gehen bis zum Deployment Server. Stellen Sie auf dem Deployment Server sicher, dass Ihre Startscripts src/main/resources/lib/* im Klassenpfad enthalten. Viola.

Verwandte Themen