zwinge Maven, Abhängigkeiten in target / lib zu kopieren

252

Wie bekomme ich die Laufzeitabhängigkeiten meines Projekts in den target/libOrdner kopiert ?

Wie es jetzt ist, enthält mvn clean installder targetOrdner nur das JAR meines Projekts, aber keine der Laufzeitabhängigkeiten.

Michael
quelle
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.
Demaniak

Antworten:

259

Das funktioniert bei mir:

<project>
  ...
  <profiles>
    <profile>
      <id>qa</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
              <execution>
                <phase>install</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.build.directory}/lib</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>
Georgy Bolyuba
quelle
11
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
Midhat
5
Dies ist in Ordnung, kopiert aber auch Testabhängigkeiten. Ich füge mir die excludeScopeOption hinzu ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Alfonso Nishikawa
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 ...
John Stauffer
quelle
80
mvn install dependency:copy-dependencies 

Funktioniert bei mir mit dem im Zielordner erstellten Abhängigkeitsverzeichnis. Mag ich!

user3286149
quelle
35

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.

Travis B. Hartwell
quelle
15
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).

Komplettes Pom-Beispiel:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>artifactId</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>process-sources</phase>

                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>

                            <configuration>
                                <outputDirectory>${targetdirectory}</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
            </plugin>
        </plugins>
    </build>
</project>

Dann renne mvn process-sources

Die JAR-Dateiabhängigkeiten finden Sie in /target/dependency

ruhsuzbaykus
quelle
1
Das Maven-Dependency-Plugin (Ziele "Copy-Dependencies", "Unpack") wird von m2e nicht unterstützt. :-(
PM
@ Gobliins verwenden $ {project.build.directory} / lib anstelle von $ {targetdirectory}
Divyang Shah
24

Wenn Sie dies gelegentlich tun möchten (und daher Ihr POM nicht ändern möchten), versuchen Sie diese Befehlszeile:

MVN-Abhängigkeit: Kopierabhängigkeiten -DoutputDirectory = $ {project.build.directory} / lib

Wenn Sie das letzte Argument weglassen , werden die Abhängigkeiten eingefügt target/dependencies.

Duncan Jones
quelle
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
Brad Parks
Kannst du es aus pom.xml heraus machen?
Gobliins
24

Versuchen Sie so etwas:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
    <archive>
        <manifest>  
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>MainClass</mainClass>
        </manifest>
    </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>install</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
adjablon
quelle
@ Thomas Ich denke, es ist maven clean install, dann finden Sie libintarget
Searene
1
Was müsste ich tun, um nur eine Abhängigkeit zu kopieren?
Alan Donizete
<classpathPrefix> lib / </ classpathPrefix> hat mir sehr geholfen. Danke dir!
Martin Pabst
Würde die installPhase durch ersetzenprocess-resources so dass die Abhängigkeiten kopiert werden, bevor das buildZiel läuft
Vyacheslav Cotruta
20

Alles was Sie brauchen ist das folgende Snippet in pom.xml's build/plugins:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

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.

    -DoutputDirectory=${project.build.directory}/lib
Isapir
quelle
7

angenommen

  • Sie möchten die pom.xml nicht ändern
  • Sie möchten keinen Testbereich (z. B. junit.jar) oder bereitgestellte Abhängigkeiten (z. B. wlfullclient.jar).

Hier ist, was für mich funktioniert hat:

mvn install dependency: copy-dependencies -DincludeScope = Laufzeit -DoutputDirectory = target / lib
Mambolis
quelle
5

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:

<assembly>
  <id>archive</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>
Reicher Verkäufer
quelle
2

Wenn Sie Ihr Projekt zu einem Kriegs- oder Ohr-Maven machen, kopieren Sie die Abhängigkeiten.

Eduard Wirch
quelle
1

Mit dem Shade Plugin können Sie ein Uber Jar erstellen, in dem Sie alle Abhängigkeiten von Drittanbietern bündeln können.

Brian Matthews
quelle
1

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:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>dk.certifikat.oces2.some.package.MyMainClass</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

(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

OleVV
quelle
Hauptklasse nicht gefunden in (3)
Thomas
1

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 :

<project>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.2</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
RubyTuesdayDONO
quelle
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