wake-up-neo.com

Kann Maven alle abhängigen JARs für ein Projekt sammeln, um bei der Anwendungsbereitstellung zu helfen?

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:

  • Ich habe eine Hauptklasse: gesetzt, und es funktioniert gut.
  • Ich habe auch den Klassenpfad in der MANIFEST.MF festgelegt, und das funktioniert auch gut.
  • Ich habe herausgefunden, wie ich <classpathPrefix> und <classpathMavenRepositoryLayout> verwende, damit dies funktioniert - aber nur auf meinem Computer. (via: <classpathPrefix>${settings.localRepository}</classpathPrefix>)
51
rcreswick

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.

81
laz

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> 
9
Gordon Dickens

Ein weiteres ist appassembler plugin
Was ich daran mag, ist, dass die App in einem gebrauchsfertigen Formular (mit einer .bat-Datei usw.)

7

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

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.

3
stimms

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/
0
ozma