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.
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>
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à...
mvn install dependency:copy-dependencies
fonctionne pour moi avec le répertoire de dépendances créé dans le dossier cible. Comme elle!
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.
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
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
.
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>
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
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
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>
si vous faites une guerre à votre projet ou tapez ear, maven copiera les dépendances.
vous pouvez utiliser le Shade Plugin pour créer un Uber jar dans lequel vous pouvez regrouper toutes vos dépendances de tiers.
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'
<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
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>
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:
il suffisait d'ajouter les dépendances Maven dans Propriétés du projet > montage de déploiement.
<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