Ich fange gerade erst an, Maven zu verwenden (und bewerte es wirklich), und ich muss in der Lage sein, schnell eine JAR - Datei für meine Anwendung und ein Verzeichnis mit allen Abhängigkeiten (zum Beispiel) zu generieren , lib), damit ich diese beiden eigenständig ausführen kann. Das Generieren der JAR-Datei mit dem richtigen Manifest ist einfach, aber ich weiß nicht, wie ich Maven dazu bringen kann, die Abhängigkeiten für das aktuelle Projekt in ein Verzeichnis lib
zu kopieren, das ich bereitstellen kann.
Da es sich um eine eigenständige Java-Anwendung handelt, bin ich nicht daran interessiert, sie in ein Maven-Repository zu implementieren, das ebenfalls ziemlich trivial oder zumindest leicht zu googeln ist.
Ich habe herausgefunden, wie man alles macht außer kopiert die abhängigen JAR-Dateien in ein bestimmtes Verzeichnis. Dies ist der Workflow, den ich suche:
$ mvn clean
$ mvn package
$ cp -r target/{lib,myApp.jar} installLocation
Dann sollte das Ausführen von myApp.jar
von installLocation
als JAR-Datei "nur funktionieren", unabhängig von meinem $CLASSPATH
.
So versuchen Sie, einige Antworten vorwegzunehmen:
<classpathPrefix>
und <classpathMavenRepositoryLayout>
verwende, damit dies funktioniert - aber nur auf meinem Computer. (via: <classpathPrefix>${settings.localRepository}</classpathPrefix>
)Was Sie untersuchen möchten, ist das Abhängigkeits-Plugin von Maven . Fügen Sie pom.xml etwas Ähnliches hinzu:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<outputDirectory>
${project.build.directory}
</outputDirectory>
</configuration>
</plugin>
Führen Sie dann mvn clean dependency:copy-dependencies
aus, um die Kopie auszuführen. Kombinieren Sie dies mit dem Assembly Plugin und Sie können alles in ein eigenständiges Archiv zur Verteilung packen.
Das Shade-Plugin interessierte mich nicht, da es alle Pakete aus allen Gläsern zusammenrollt.
Um alle externen Bibliotheken einzubeziehen, können Sie das Abhängigkeits-Plugin wie oben erwähnt verwenden.
In diesem Beispiel wird vor der Paketphase ein "lib" -Verzeichnis unter "target/classes" erstellt.
<Plugin> <groupId> org.Apache.maven.plugins </ groupId> <ArtifactId> Maven-Abhängigkeits-Plugin </ ArtifactId> <Version> 2.6 </ Version> <Ausführungen> <Ausführung> <id> Kopierabhängigkeiten </ id> <phase> Vorbereitungspaket </ phase> <Ziele> <Ziel> Kopierabhängigkeiten </ Ziel> </ goals> <Konfiguration> <outputDirectory> target/classes/lib </ outputDirectory> <overWriteIfNewer> true </ overWriteIfNewer> <excludeGroupIds> junit, org.hamcrest, org.mockito, org.powermock, $ {project.groupId} </ excludeGroupIds> </ configuration> </ execution> <Ausführung> <phase> Erzeugungsquellen </ phase> <Ziele> <Ziel> Quellen </ Ziel> </ goals> </ execution> </ executions> <Konfiguration> <verbose> true </ verbose> <detail> true </ detail> <outputDirectory> $ {project.build.directory} </ outputDirectory> .__ </ configuration> </ plugin>
Ein weiteres ist appassembler plugin
Was ich daran mag, ist, dass die App in einem gebrauchsfertigen Formular (mit einer .bat-Datei usw.)
Schauen Sie sich das Abhängigkeits-Plugin von maven an, insbesondere das Ziel der Kopierabhängigkeiten. Der Verwendungsabschnitt beschreibt, wie Sie genau das tun, was Sie möchten.
Um dies von der Kommandozeile aus zu tun, machen Sie einfach:
$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR
Es kann sicher. Sie müssen das shade - Plugin verwenden, das durch Hinzufügen hinzugefügt werden kann
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.3-SNAPSHOT</version>
<configuration>
<!-- put your configurations here -->
</configuration>
</plugin>
zu deinem Projekt.
Mit maven.repo.local kann man alle Jars sammeln, aber sie werden in einem Verzeichnis mit Maven-Hierarchie (.m2) gesammelt.
mvn install -Dmaven.repo.local=./pick/some/folder
Sie können sie dann (unter Linux) sammeln:
mkdir flat-repo
find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/