web-dev-qa-db-fra.com

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

Comment copier les dépendances d'exécution de mon projet dans le dossier target/lib

À l'heure actuelle, après mvn clean install, le dossier target contient uniquement le fichier jar de mon projet, mais aucune des dépendances d'exécution.

226
Michael

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

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

  • Si vous souhaitez regrouper vos dépendances dans un fichier WAR ou EAR, définissez simplement le type d'empaquetage de votre projet sur EAR ou WAR. Maven regroupera les dépendances au bon endroit.
  • Si vous souhaitez créer un fichier JAR contenant votre code ainsi que toutes vos dépendances, utilisez le plug-in Assembly avec le descripteur jar-with-dependencies. Maven générera un fichier JAR complet avec toutes vos classes ainsi que les classes de toutes les dépendances.
  • Si vous voulez simplement extraire vos dépendances dans le répertoire cible de manière interactive, utilisez le plugin dependency pour copier vos fichiers.
  • Si vous souhaitez extraire les dépendances pour un autre type de traitement, vous devrez probablement générer votre propre plug-in. Il existe des API pour obtenir la liste des dépendances et leur emplacement sur le disque. Vous devrez le prendre à partir de là ...
79
John Stauffer
mvn install dependency:copy-dependencies 

Fonctionne pour moi avec le répertoire des dépendances créé dans le dossier cible. J'aime ça!

66
user3286149

Jetez un coup d'œil au plugin dépendance Maven , plus précisément à l'objectif dépendance: dépendances de copie Jetez un coup d’œil à l’exemple sous le titre La dépendance: dépendances à la copie mojo. Définissez la propriété de configuration outputDirectory sur $ {basedir}/target/lib (je crois que vous devrez tester).

J'espère que cela t'aides.

33
Travis B. Hartwell

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 lorsque je travaille avec Vaadin).

Exemple de pom complet:

<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 lancez mvn process-sources

Les dépendances du fichier jar peuvent être trouvées dans /target/dependency

30
ruhsuzbaykus

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

target/dependencies.

22
Duncan Jones

Essayez quelque chose comme ça:

<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

Tout ce dont vous avez besoin est l'extrait suivant dans le build/plugins de 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>

Ce qui précède s’exécutera dans la phase package lorsque vous exécuterez 

mvn clean package

Et les dépendances seront copiées dans le répertoire outputDirectory spécifié dans l’extrait, c’est-à-dire lib dans ce cas.

Si vous ne voulez le faire que de temps en temps, aucune modification du fichier pom.xml n'est requise. Il suffit de lancer ce qui suit:

mvn clean package dependency:copy-dependencies

Pour remplacer l'emplacement par défaut, à savoir ${project.build.directory}/dependencies, ajoutez une propriété système nommée outputDirectory, i.e.

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

supposant

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

voici ce qui a fonctionné pour moi:

Dépendances d'installation de 
 mvn: dépendances de copie -DincludeScope = runtime -DoutputDirectory = target/lib 
6
mambolis

Si vous souhaitez livrer un ensemble de votre fichier jar d'application, ainsi que toutes ses dépendances et certains scripts pour appeler MainClass, consultez le appassembler-maven-plugin .

La configuration suivante générera des scripts pour Windows et Linux afin de lancer l'application (avec un chemin généré référençant tous les fichiers jars de dépendance, téléchargez toutes les dépendances (dans un dossier lib sous target/appassembler). Le plugin Assembly peut ensuite être utilisé pour empaqueter tout le répertoire appassembler dans un zip qui est installé/déployé avec le jar dans le référentiel.

  <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 Assembly (dans src/main/Assembly) pour empaqueter le répertoire en tant que Zip serait:

<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

Si vous faites de votre projet une guerre ou une oreille type maven copiera les dépendances.

2
Eduard Wirch

Vous pouvez utiliser le Shade Plugin pour créer un uber jar dans lequel vous pouvez regrouper toutes vos dépendances tierces.

1
Brian Matthews

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

(1) Dans le pom, sous <build> <plugins>, j'ai inclus:

<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) Lancer mvn compile Assembly: assembly a généré le fichier my-project-0.1-SNAPSHOT-jar-with-dependencies.jar souhaité dans le répertoire cible du projet.

(3) J'ai exécuté le fichier JAR avec Java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar.

1
OleVV

C'est une solution lourde pour incorporer des dépendances lourdes, mais le plug-in Assembly Plugin de Maven fait l'affaire pour moi. 

@ Rich Seller answer devrait fonctionner, bien que dans le cas simple, vous n'auriez besoin que de cet extrait du 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
RubyTuesdayDONO

Si vous rencontrez 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, consultez la page suivante:

ClassNotFoundException DispatcherServlet lors du lancement de Tomcat (dépendances Maven non copiées dans wtpwebapps)

Vous deviez simplement ajouter les dépendances Maven dans Propriétés du projet> Assemblage de déploiement.

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 C'est mon pom, est-ce que je manque quelque chose? le jar créé avec les dépendances, ne contient aucune classe lib ou jar 

0
user3123372