web-dev-qa-db-ger.com

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

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

Nach mvn clean install enthält der target-Ordner nur das jar meines Projekts, jedoch keine Laufzeitabhängigkeiten.

226
Michael

Das funktioniert für mich:

<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>
234
Georgy Bolyuba

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 Pakettyp 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 mit all Ihren Abhängigkeiten enthält, verwenden Sie das Assembly plugin mit dem Deskriptor jar-with-dependencies. Maven generiert eine vollständige JAR-Datei mit allen Ihren Klassen sowie den Klassen aus allen Abhängigkeiten.
  • Wenn Sie Ihre Abhängigkeiten einfach interaktiv in das Zielverzeichnis ziehen möchten, verwenden Sie das dependency plugin, um Ihre Dateien zu kopieren.
  • Wenn Sie die Abhängigkeiten für andere Verarbeitungsarten einholen möchten, müssen Sie wahrscheinlich ein 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 aus nehmen ...
79
John Stauffer
mvn install dependency:copy-dependencies 

Funktioniert für mich mit Abhängigkeiten im Zielordner. Mag ich!

66
user3286149

Schauen Sie sich das Plugin Maven Abhängigkeits an, insbesondere das Dependency: copy-Dependencies Ziel . Werfen Sie einen Blick auf das Beispiel unter der Überschrift The dependency: copy-dependencies mojo. Setzen Sie die Konfigurationseigenschaft outputDirectory auf $ {basedir}/target/lib (Ich glaube, Sie müssen testen).

Hoffe das hilft.

33

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.

Vollständiges 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 mvn process-sources ausführen

Die Abhängigkeiten der JAR-Datei finden Sie in /target/dependency.

30
ruhsuzbaykus

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

target/dependencies platziert.

22
Duncan Jones

Versuchen Sie etwas so:

<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>
20
adjablon

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

<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 package-Phase ausgeführt, wenn Sie es ausführen 

mvn clean package

In diesem Fall werden die Abhängigkeiten in das im Snippet angegebene outputDirectory kopiert, d. H. lib.

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

Fügen Sie zum Überschreiben des Standardverzeichnisses ${project.build.directory}/dependencies eine Systemeigenschaft mit dem Namen outputDirectory hinzu, d. H.

    -DoutputDirectory=${project.build.directory}/lib
12
isapir

vorausgesetzt

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

hier ist was für mich gearbeitet:

mvn install Abhängigkeit: Kopie-Abhängigkeiten -DincludeScope = Laufzeit -DoutputDirectory = Ziel/lib.
6
mambolis

Wenn Sie ein Bündel Ihrer Anwendungsjar zusammen mit allen Abhängigkeiten und einigen Skripts zum Aufrufen der MainClass bereitstellen möchten, schauen Sie sich das appassembler-maven-plugin an.

Die folgende Konfiguration generiert Skripts für Windows und Linux, um die Anwendung zu starten (mit einem generierten Pfad, der auf alle Abhängigkeitsjobs verweist, laden Sie alle Abhängigkeiten herunter (in einen lib-Ordner unterhalb von target/appassembler). Anschließend kann das Assembly Plugin verwendet werden Um das gesamte Appassembler-Verzeichnis in ein Zip-Paket zu packen, das 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 des Verzeichnisses als Zip wäre:

<Assembly>
  <id>archive</id>
  <formats>
    <format>Zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</Assembly>
5
Rich Seller

Wenn Sie Ihr Projekt zu einem Kriegs- oder Gehörtyp machen, kopiert Maven die Abhängigkeiten.

2
Eduard Wirch

Sie können das Shade Plugin verwenden, um ein Uber-Jar zu erstellen, in dem Sie alle Abhängigkeiten von Drittanbietern bündeln können.

1
Brian Matthews

Um es kurz zu formulieren, was bereits gesagt wurde. Ich wollte eine ausführbare JAR-Datei erstellen, die neben meinem Code auch Abhängigkeiten enthielt. Das hat für mich funktioniert:

(1) Im pom unter <build> <plugins> habe ich 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 von mvn compile Assembly: Die Assembly erzeugte das gewünschte my-project-0.1-SNAPSHOT-jar-with-dependencies.jar im Zielverzeichnis des Projekts.

(3) Ich habe JAR mit Java -jar-mein-Projekt-0.1-SNAPSHOT-jar-with-dependencies.jar ausgeführt

1
OleVV

Es ist eine schwierige Lösung für das Einbetten starker Abhängigkeiten, aber Maven Assembly Plugin macht den Trick für mich. 

@ Die Antwort von Rich Seller sollte funktionieren, obwohl Sie in einfacheren Fällen nur diesen Auszug aus dem usage guide 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>
1
RubyTuesdayDONO

Wenn bei der Ausführung auf einem Tomcat-Server in Eclipse Probleme in Bezug auf Abhängigkeiten auftreten, die nicht in der Datei WEB-INF/lib enthalten sind, lesen Sie Folgendes:

ClassNotFoundException DispatcherServlet beim Starten von Tomcat (Maven-Abhängigkeiten werden nicht in wtpwebapps kopiert)

Sie mussten lediglich die Maven-Abhängigkeiten in Projekteigenschaften> Bereitstellungsassembly hinzufügen.

0
hemetsu
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.Edge</groupId>
  <artifactId>STORM2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>STORM2</name>
  <url>http://maven.Apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
   <profiles>

  </profiles>
<build>
    <plugins>   
          <plugin>
            <artifactId>maven-Assembly-plugin</artifactId>
             <configuration>
                <archive>
                <manifest>
                <mainClass>com.Edge.STORM2.LogAnalyserStorm</mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
          </plugin>

    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.Apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
</dependency>
  </dependencies>
</project>

@john Das ist mein Pom, fehlt mir etwas? Die erstellten jar-with-Abhängigkeiten enthalten keine lib-Klasse oder -Jar 

0
user3123372