2009-02-20 12 views
47

Ich fange gerade an, Maven zu verwenden, (evaluieren, 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 lib) zu generieren, damit ich bereitstellen kann diese beiden werden in einer eigenständigen Art und Weise betrieben. Das Generieren der JAR-Datei mit dem richtigen Manifest ist einfach, aber ich weiß nicht, wie Maven dazu gebracht werden kann, die Abhängigkeiten für das aktuelle Projekt in ein lib-Verzeichnis zu kopieren, das ich bereitstellen kann.Kann Maven alle abhängigen JARs für ein Projekt sammeln, um die Anwendungsbereitstellung zu unterstützen?

Da dies für eine eigenständige Java-Anwendungen ist, bin ich nicht interessiert an der Bereitstellung in einem Maven-Repository, das ist auch ziemlich trivial, oder zumindest leicht googleable.

Ich habe herausgefunden, wie man alles macht außer kopieren Sie die abhängigen JAR-Dateien in ein bestimmtes Verzeichnis. Dies ist der Workflow Ich suche nach:

$ mvn clean 
$ mvn package 
$ cp -r target/{lib,myApp.jar} installLocation 

Dann myApp.jar von installLocation als JAR-Datei ausgeführt wird, sollte unabhängig von meinem $CLASSPATH „einfach funktionieren“.

Um zu versuchen und vorgreifen einige Antworten:

  • ich eine Main-Klasse haben Sie: set, und es funktioniert gut.
  • Ich habe auch den Klassenpfad in der MANIFEST.MF festgelegt, und das funktioniert auch.
  • Ich habe herausgefunden, wie man <classpathPrefix> und <classpathMavenRepositoryLayout> verwendet, um diese Arbeit zu machen - aber nur auf meinem Rechner. (über: <classpathPrefix>${settings.localRepository}</classpathPrefix>)

Antwort

73

Was Sie untersuchen möchten, ist Maven's dependency plugin. Fügen Sie etwas Ähnliches wie die folgenden zu pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <configuration> 
     <outputDirectory> 
      ${project.build.directory} 
     </outputDirectory> 
    </configuration> 
</plugin> 

Dann mvn clean dependency:copy-dependencies laufen, um die Kopie zu kopieren auszuführen. Kombinieren Sie dies mit der assembly plugin und Sie können alles in ein eigenständiges Archiv für die Verteilung verpacken.

+0

hinzugefügt dies meine pom.xml in Eclipse. Nichts passiert –

+0

Ich musste Maven außerhalb Eclipse herunterladen, fügte den Ordner/bin zu meinem Pfad dann rannte 'mvn Abhängigkeit: Copy-Abhängigkeiten'. JA! Jetzt funktioniert es, Maven macht das, was es tun soll! Jetzt kopieren Sie einfach alle * .jar-Dateien in mein Projekt und fügen sie meinem Build-Pfad hinzu –

3

Es kann sicher. Sie müssen die shade plugin verwenden, die

 <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 einem Projekt durch Hinzufügen getan werden kann.

6

Noch ein anderer ist appassembler plugin
Was ich darüber ist, dass es die App in einer Form, gebrauchsfertig verpackt (mit einer .bat Datei ans so)

7

ich nicht für das Shade Plugin scherte seit Es rollt alle Pakete aus allen Gläsern zusammen.

Um alle externen Bibliotheken einzuschließen, können Sie das Dependency Plugin wie oben erwähnt verwenden.

In diesem Beispiel wird ein "lib" -Verzeichnis unter "target/classes" vor der "package" -Phase erstellt.

 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>target/classes/lib</outputDirectory> 
     <overWriteIfNewer>true</overWriteIfNewer> 
     <excludeGroupIds> 
      junit,org.hamcrest,org.mockito,org.powermock,${project.groupId} 
     </excludeGroupIds> 
     </configuration> 
    </execution> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
     <goal>sources</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <verbose>true</verbose> 
    <detail>true</detail> 
    <outputDirectory>${project.build.directory}</outputDirectory> 
    </configuration> 
</plugin> 
2

Werfen Sie einen Blick auf Abhängigkeits-Plugin von Maven, speziell das Ziel der Kopierabhängigkeit. Der Verwendungsabschnitt beschreibt, wie Sie genau das machen, was Sie wollen.

es von der Kommandozeile tun tun, nur:

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR 
-1

Mit maven.repo.local man kann alle Gläser sammeln, aber, werden sie in ein Verzeichnis mit Maven Hierarchie gesammelt (.m2) .

mvn install -Dmaven.repo.local=./pick/some/folder 

Sie können sie dann sammeln (unter Linux):

mkdir flat-repo 
find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/