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.


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>

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 ...

80
mvn install dependency:copy-dependencies 

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



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


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.


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>

@ 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

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

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>

2

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



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


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>

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.