Warum brauchst du das? Was ist die Art Ihres Maven-Projekts? Krug ?
Alexandre Victoor
Der Typ meines Maven-Projekts ist JAR. Ich brauche das, weil es viele Abhängigkeiten gibt und ich versuche, das JAR als ausführbare Datei bereitzustellen.
Michael
2
Vorsicht bei Assemblys - Wenn Sie überlappende Pakete / Klassen zwischen den Deps haben, werden Sie wahrscheinlich eine schlechte Zeit haben.
Wenn Sie möchten, dass dies die ganze Zeit passiert, entfernen Sie die Wrapper <profiles> ... <profile> und lassen Sie das <build> -Tag direkt unter <project> sein
Dan Halbert
3
@Georgy dies schüchtert nicht die Gläser in lib /, sondern schließt die Klassen in das kompilierte Projekt ein
Funktioniert gut, aber es ist nicht erforderlich, das Build-Tag in den Profil-Tags zu platzieren.
Julien BRENELIERE
2
Hinweis: <excludeScope>test</excludeScope>geht in den configurationKnoten.
Jesse Chisholm
84
Der beste Ansatz hängt davon ab, was Sie tun möchten:
Wenn Sie Ihre Abhängigkeiten in einer WAR- oder EAR-Datei bündeln möchten, setzen Sie einfach den Verpackungstyp Ihres Projekts auf EAR oder WAR. Maven bündelt die Abhängigkeiten an der richtigen Stelle.
Wenn Sie eine JAR-Datei erstellen möchten, die Ihren Code zusammen mit all Ihren Abhängigkeiten enthält, verwenden Sie das Assembly- Plugin mit dem JAR-with-Dependencies- Deskriptor. Maven generiert eine vollständige JAR-Datei mit all Ihren Klassen sowie den Klassen aus Abhängigkeiten.
Wenn Sie Ihre Abhängigkeiten einfach interaktiv in das Zielverzeichnis ziehen möchten, kopieren Sie Ihre Dateien mit dem Abhängigkeits- Plugin.
Wenn Sie die Abhängigkeiten für eine andere Art der Verarbeitung abrufen möchten, müssen Sie wahrscheinlich Ihr eigenes Plugin generieren. Es gibt APIs, um die Liste der Abhängigkeiten und ihren Speicherort auf der Festplatte abzurufen. Sie müssen es von dort nehmen ...
Schauen Sie sich das Maven-Abhängigkeits-Plugin an , insbesondere das Ziel Abhängigkeit: Kopieren-Abhängigkeiten . Schauen Sie sich das Beispiel unter der Überschrift Die Abhängigkeit: Kopierabhängigkeiten mojo an . Stellen Sie die ausgabeKonfigurationsEigenschaft auf $ {basedir} / target / lib (glaube ich, werden Sie zu testen).
Alternativ können Sie $ {project.build.directory} / lib anstelle von $ {basedir} / target / lib
Cuga
31
Eine einfache und elegante Lösung für den Fall, dass die Abhängigkeiten in ein Zielverzeichnis kopiert werden müssen, ohne andere Phasen von Maven zu verwenden (ich fand dies sehr nützlich, wenn ich mit Vaadin arbeite).
Vielen Dank! Dies ist der einfachste Weg, um die für ein Projekt erforderlichen Bibliotheken einfach in einen Ordner zu kopieren, damit Sie sie bei Bedarf an einen anderen Ort kopieren können, z. B. in ein nicht auf Maven basierendes Projekt. Beachten Sie, dass Sie natürlich einfach einen fest codierten Ordner übergeben können, um ihn zu verwenden, wenn Sie möchten, z. B.mvn dependency:copy-dependencies -DoutputDirectory=./lib
Das Obige wird in der packagePhase ausgeführt, in der Sie ausgeführt werden
mvn clean package
Und die Abhängigkeiten werden in das im Snippet angegebene outputDirectory kopiert, dh libin diesem Fall.
Wenn Sie dies nur gelegentlich tun möchten, sind keine Änderungen an pom.xml erforderlich. Führen Sie einfach Folgendes aus:
mvn clean package dependency:copy-dependencies
So überschreiben Sie den Standardspeicherort: ${project.build.directory}/dependencies , fügen Sie eine Systemeigenschaft mit dem Namen hinzu outputDirectory, d. H.
Wenn Sie ein Bundle Ihrer Anwendungs-JAR mit all ihren Abhängigkeiten und einigen Skripten zum Aufrufen der MainClass bereitstellen möchten, sehen Sie sich das Appassembler-Maven-Plugin an .
Die folgende Konfiguration generiert Skripts für Windows und Linux zum Starten der Anwendung (mit einem generierten Pfad, der auf alle Abhängigkeitsgläser verweist, laden Sie alle Abhängigkeiten herunter (in einen lib-Ordner unter target / appassembler). Das Assembly-Plugin kann dann zum Packen des Ganzen verwendet werden Appassembler-Verzeichnis zu einer Zip-Datei, die zusammen mit dem JAR im Repository installiert / bereitgestellt wird.
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>appassembler-maven-plugin</artifactId><version>1.0</version><executions><execution><id>generate-jsw-scripts</id><phase>package</phase><goals><goal>generate-daemons</goal></goals><configuration><!--declare the JSW config --><daemons><daemon><id>myApp</id><mainClass>name.seller.rich.MyMainClass</mainClass><commandLineArguments><commandLineArgument>start</commandLineArgument></commandLineArguments><platforms><platform>jsw</platform></platforms></daemon></daemons><target>${project.build.directory}/appassembler</target></configuration></execution><execution><id>assemble-standalone</id><phase>integration-test</phase><goals><goal>assemble</goal></goals><configuration><programs><program><mainClass>name.seller.rich.MyMainClass</mainClass><!-- the name of the bat/sh files to be generated --><name>mymain</name></program></programs><platforms><platform>windows</platform><platform>unix</platform></platforms><repositoryLayout>flat</repositoryLayout><repositoryName>lib</repositoryName></configuration></execution></executions></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><version>2.2-beta-4</version><executions><execution><phase>integration-test</phase><goals><goal>single</goal></goals><configuration><descriptors><descriptor>src/main/assembly/archive.xml</descriptor></descriptors></configuration></execution></executions></plugin>
Der Assembly-Deskriptor (in src / main / Assembly) zum Packen der Direcotry als Zip lautet:
Nur um kurz zu formulieren, was bereits gesagt wurde. Ich wollte eine ausführbare JAR-Datei erstellen, die meine Abhängigkeiten zusammen mit meinem Code enthält. Das hat bei mir funktioniert:
(1) Im Pom habe ich unter <build> <plugins> Folgendes eingefügt:
(2) Ausführen der mvn-Kompilierungsassembly: Die Assembly hat die gewünschte my-project-0.1-SNAPSHOT-jar-with-dependencies.jar im Zielverzeichnis des Projekts erstellt.
(3) Ich habe die JAR mit java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar ausgeführt
Ihr Codebeispiel löst das Problem nicht, sondern bündelt einfach alles in einer einzigen JAR. Ja, das Assembly-Plugin kann verwendet werden, um dieses Ziel zu erreichen, aber nicht so.
Duncan Jones
Obwohl Sie beim weiteren Lesen vielleicht auf diesen Kommentar antworten .
Duncan Jones
Es ist so lange her, dass ich mich nicht wirklich erinnere… und ich bin ziemlich verrostet, seit ich mich in meiner letzten Firma auf die Linux-Administration konzentriert habe - aber danke für das Feedback!
RubyTuesdayDONO
0
Wenn Sie Probleme mit Abhängigkeiten haben, die nicht in der Datei WEB-INF / lib angezeigt werden, wenn Sie auf einem Tomcat-Server in Eclipse ausgeführt werden, sehen Sie sich Folgendes an:
Antworten:
Das funktioniert bei mir:
quelle
excludeScope
Option hinzu ( maven.apache.org/plugins/maven-dependency-plugin/… ).<excludeScope>test</excludeScope>
geht in denconfiguration
Knoten.Der beste Ansatz hängt davon ab, was Sie tun möchten:
quelle
Funktioniert bei mir mit dem im Zielordner erstellten Abhängigkeitsverzeichnis. Mag ich!
quelle
Schauen Sie sich das Maven-Abhängigkeits-Plugin an , insbesondere das Ziel Abhängigkeit: Kopieren-Abhängigkeiten . Schauen Sie sich das Beispiel unter der Überschrift Die Abhängigkeit: Kopierabhängigkeiten mojo an . Stellen Sie die ausgabeKonfigurationsEigenschaft auf $ {basedir} / target / lib (glaube ich, werden Sie zu testen).
Hoffe das hilft.
quelle
Eine einfache und elegante Lösung für den Fall, dass die Abhängigkeiten in ein Zielverzeichnis kopiert werden müssen, ohne andere Phasen von Maven zu verwenden (ich fand dies sehr nützlich, wenn ich mit Vaadin arbeite).
Komplettes Pom-Beispiel:
Dann renne
mvn process-sources
Die JAR-Dateiabhängigkeiten finden Sie in
/target/dependency
quelle
Wenn Sie dies gelegentlich tun möchten (und daher Ihr POM nicht ändern möchten), versuchen Sie diese Befehlszeile:
Wenn Sie das letzte Argument weglassen , werden die Abhängigkeiten eingefügt
target/dependencies
.quelle
mvn dependency:copy-dependencies -DoutputDirectory=./lib
Versuchen Sie so etwas:
quelle
maven clean install
, dann finden Sielib
intarget
install
Phase durch ersetzenprocess-resources
so dass die Abhängigkeiten kopiert werden, bevor dasbuild
Ziel läuftAlles was Sie brauchen ist das folgende Snippet in pom.xml's
build/plugins
:Das Obige wird in der
package
Phase ausgeführt, in der Sie ausgeführt werdenUnd die Abhängigkeiten werden in das im Snippet angegebene outputDirectory kopiert, dh
lib
in diesem Fall.Wenn Sie dies nur gelegentlich tun möchten, sind keine Änderungen an pom.xml erforderlich. Führen Sie einfach Folgendes aus:
So überschreiben Sie den Standardspeicherort:
${project.build.directory}/dependencies
, fügen Sie eine Systemeigenschaft mit dem Namen hinzuoutputDirectory
, d. H.quelle
angenommen
Hier ist, was für mich funktioniert hat:
quelle
Wenn Sie ein Bundle Ihrer Anwendungs-JAR mit all ihren Abhängigkeiten und einigen Skripten zum Aufrufen der MainClass bereitstellen möchten, sehen Sie sich das Appassembler-Maven-Plugin an .
Die folgende Konfiguration generiert Skripts für Windows und Linux zum Starten der Anwendung (mit einem generierten Pfad, der auf alle Abhängigkeitsgläser verweist, laden Sie alle Abhängigkeiten herunter (in einen lib-Ordner unter target / appassembler). Das Assembly-Plugin kann dann zum Packen des Ganzen verwendet werden Appassembler-Verzeichnis zu einer Zip-Datei, die zusammen mit dem JAR im Repository installiert / bereitgestellt wird.
Der Assembly-Deskriptor (in src / main / Assembly) zum Packen der Direcotry als Zip lautet:
quelle
Wenn Sie Ihr Projekt zu einem Kriegs- oder Ohr-Maven machen, kopieren Sie die Abhängigkeiten.
quelle
Mit dem Shade Plugin können Sie ein Uber Jar erstellen, in dem Sie alle Abhängigkeiten von Drittanbietern bündeln können.
quelle
Nur um kurz zu formulieren, was bereits gesagt wurde. Ich wollte eine ausführbare JAR-Datei erstellen, die meine Abhängigkeiten zusammen mit meinem Code enthält. Das hat bei mir funktioniert:
(1) Im Pom habe ich unter <build> <plugins> Folgendes eingefügt:
(2) Ausführen der mvn-Kompilierungsassembly: Die Assembly hat die gewünschte my-project-0.1-SNAPSHOT-jar-with-dependencies.jar im Zielverzeichnis des Projekts erstellt.
(3) Ich habe die JAR mit java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar ausgeführt
quelle
Es ist eine schwere Lösung zum Einbetten schwerer Abhängigkeiten, aber das Assembly Plugin von Maven erledigt den Trick für mich.
Die Antwort von @ Rich Seller sollte funktionieren, obwohl Sie in einfacheren Fällen nur diesen Auszug aus der Bedienungsanleitung benötigen sollten :
quelle
Wenn Sie Probleme mit Abhängigkeiten haben, die nicht in der Datei WEB-INF / lib angezeigt werden, wenn Sie auf einem Tomcat-Server in Eclipse ausgeführt werden, sehen Sie sich Folgendes an:
ClassNotFoundException DispatcherServlet beim Starten von Tomcat (Maven-Abhängigkeiten nicht in wtpwebapps kopiert)
Sie mussten lediglich die Maven-Abhängigkeiten unter Projekteigenschaften> Bereitstellungsassembly hinzufügen.
quelle