forcer Maven à copier les dépendances dans target / lib

Comment faire pour que les dépendances d'exécution de mon projet soient copiées dans le dossier target/lib ?

tel qu'il est en ce moment, après mvn clean install le dossier target ne contient que le jar de mon projet, mais aucune des dépendances d'exécution.

219
demandé sur isapir 2008-09-19 02:26:09

16 réponses

ça marche pour moi:

<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>
231
répondu Georgy Bolyuba 2014-08-22 06:49:33

La meilleure approche dépend de ce que vous voulez faire:

  • si vous voulez regrouper vos dépendances dans un fichier WAR ou EAR, définissez simplement le type d'emballage de votre projet à EAR ou WAR. Maven regroupera les dépendances au bon endroit.
  • si vous voulez créer un fichier JAR qui inclut votre code avec toutes vos dépendances, puis utiliser le Assemblée plugin avec le jar-with-dependencies descriptor. Maven générera un fichier JAR complet avec toutes vos classes ainsi que les classes à partir de toutes les dépendances.
  • si vous voulez simplement tirer vos dépendances dans le répertoire cible de façon interactive, alors utilisez le plugin dépendance pour copier vos fichiers.
  • Si vous voulez tirer dans les dépendances d'un autre type de traitement, vous aurez probablement besoin de générer votre propre plugin. Il y a des API pour obtenir la liste des dépendances, et leur emplacement sur le disque. Vous aurez à prendre à partir de là...
78
répondu John Stauffer 2016-04-21 11:15:51
mvn install dependency:copy-dependencies 

fonctionne pour moi avec le répertoire de dépendances créé dans le dossier cible. Comme elle!

62
répondu user3286149 2014-02-08 02:49:55

jetez un oeil au Maven dependency plugin , spécifiquement, le dependency:copy-dependencies goal . Jetez un oeil à l'exemple sous la rubrique la dépendance:copy-dependencies mojo . Définissez la propriété de configuration outputDirectory à ${basedir}/target/lib (je pense que vous devrez tester).

Espérons que cette aide.

33
répondu Travis B. Hartwell 2008-09-19 00:03:12

une solution simple et élégante pour le cas où il faut copier les dépendances dans un répertoire cible sans utiliser d'autres phases de maven (j'ai trouvé cela très utile en travaillant avec Vaadin).

Complète pom exemple:

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

puis exécuter mvn process-sources

les dépendances du fichier jar se trouvent dans /target/dependency

29
répondu ruhsuzbaykus 2014-12-11 09:14:48

si vous voulez le faire de façon occasionnelle (et donc ne pas vouloir changer votre POM), essayez cette ligne de commande:

mvn dependency:copy-dependencies -DoutputDirectory=${project.build.directory}/lib

si vous omettez le dernier argument , les dépendances sont placées dans target/dependencies .

22
répondu Duncan Jones 2014-08-22 06:59:24

Essayez quelque chose comme ceci:

<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
répondu adjablon 2014-12-11 09:14:20

Tout ce dont vous avez besoin est l'extrait suivant à l'intérieur de pom.xml 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>

ce qui précède s'exécute dans la phase package lorsque vous exécutez

mvn clean package

et les dépendances seront copiées dans le répertoire outputDirectory spécifié dans le snippet, i.e. lib dans ce cas.

si vous ne voulez le faire qu'occasionnellement, alors aucun changement à pom.xml sont nécessaires. Il suffit d'exécuter ce qui suit:

mvn clean package dependency:copy-dependencies

pour outrepasser l'emplacement par défaut, qui est ${project.build.directory}/dependencies , ajouter une propriété du système nommé outputDirectory , i.e.

    -DoutputDirectory=${project.build.directory}/lib
7
répondu isapir 2017-12-24 20:39:57

supposant

  • vous ne voulez pas modifier le pom.xml
  • vous ne voulez pas de test de portée (par exemple, junit.jar) ou des dépendances fournies (par exemple wlfullclient.jar)

voici ce qui a fonctionné pour moi:

mvn install dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/lib
6
répondu mambolis 2017-12-13 17:55:54

si vous voulez livrer un paquet de votre pot d'application, avec toutes ses dépendances et quelques scripts pour invoquer la classe principale, regardez le appassembler-maven-plugin .

la configuration suivante générera des scripts pour Window et Linux pour lancer l'application (avec un chemin généré faisant référence à tous les pots de dépendances, téléchargez toutes les dépendances (dans un dossier lib sous target/appassembler). L'Assemblée le plugin peut alors être utilisé pour empaqueter l'ensemble du répertoire d'appassembleur dans un zip qui est installé/déployé avec le jar dans le dépôt.

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

le descripteur d'assemblage (dans src/main / assembly) pour empaqueter le direcotry comme zip serait:

<assembly>
  <id>archive</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>
4
répondu Rich Seller 2018-05-10 09:42:41

si vous faites une guerre à votre projet ou tapez ear, maven copiera les dépendances.

2
répondu Eduard Wirch 2008-09-18 22:44:14

vous pouvez utiliser le Shade Plugin pour créer un Uber jar dans lequel vous pouvez regrouper toutes vos dépendances de tiers.

1
répondu Brian Matthews 2008-09-18 22:59:48

juste pour préciser ce qui a déjà été dit en bref. Je voulais créer un fichier JAR exécutable de mes dépendances avec mon code. Cela a fonctionné pour moi:

(1) Dans le pom, en vertu de l' , j'ai compris:

<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) Exécuter mvn compiler assembly:assembly a produit Le my-project-0.1-SNAPSHOT-jar-with-dependencies désiré.jar dans le répertoire cible du projet.

(3) j'ai couru le pot avec java-jar mon-projet-0.1-SNAPSHOT-jar-with-dependencies.jar

1
répondu OleVV 2010-09-22 12:23:53

c'est une solution lourde pour intégrer des dépendances lourdes, mais le de Maven" Plugin D'assemblage fait l'affaire pour moi.

@ Riche du Vendeur de réponse devrait fonctionner, même si, pour les cas les plus simples, vous devriez seulement besoin de cet extrait de la guide d'utilisation :

<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
répondu RubyTuesdayDONO 2017-05-23 11:47:28

si vous avez des problèmes liés à des dépendances n'apparaissant pas dans le fichier WEB-INF/lib lors de l'exécution sur un serveur Tomcat dans Eclipse, jetez un oeil à ceci:

ClassNotFoundException DispatcherServlet lors du lancement de Tomcat (les dépendances Maven n'est copié sur wtpwebapps)

il suffisait d'ajouter les dépendances Maven dans Propriétés du projet > montage de déploiement.

0
répondu hemetsu 2017-05-23 11:55:10
<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>

@jean C'est mon pom, j'ai loupé quelque chose? le jar créé-avec des dépendances, ne contient pas de classe de lib ou de jar

0
répondu user3123372 2018-02-19 04:04:10