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


252

Comment obtenir les dépendances d'exécution de mon projet copiées dans le target/libdossier?

Comme c'est le cas actuellement, après que mvn clean installle targetdossier ne contienne que le pot de mon projet, mais aucune des dépendances d'exécution.


Pourquoi en avez-vous besoin? Quel est le type de votre projet maven? pot?
Alexandre Victoor

Le type de mon projet maven est JAR. J'en ai besoin car il y a beaucoup de dépendances et j'essaie de déployer le pot en tant qu'exécutable.
Michael

2
Attention aux assemblys - si vous avez des packages / classes qui se chevauchent entre les deps, vous aurez probablement un mauvais moment.
demaniak

Réponses:


260

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>

11
Si vous voulez que cela se produise tout le temps, supprimez les wrappers <profiles> ... <profile> et faites en sorte que la balise <build> soit juste sous <project>
Dan Halbert

3
@Georgy cela n'affaiblit pas les bocaux dans lib /, mais inclut les classes dans le projet compilé
Midhat

5
C'est bien, mais c'est aussi la copie des dépendances de test. J'ajoute moi-même l' excludeScopeoption ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Alfonso Nishikawa

Fonctionne bien mais il n'est pas nécessaire de placer la balise de construction à l'intérieur des balises de profil.
Julien BRENELIERE

2
Remarque: <excludeScope>test</excludeScope>va à l'intérieur du configurationnœud.
Jesse Chisholm

84

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 de package de votre projet sur EAR ou WAR. Maven regroupera les dépendances au bon endroit.
  • Si vous souhaitez créer un fichier JAR qui inclut votre code avec toutes vos dépendances, utilisez le plugin d' 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 souhaitez simplement extraire vos dépendances dans le répertoire cible de manière interactive, utilisez le plug-in de dépendance 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 plugin. Il existe des API pour obtenir la liste des dépendances et leur emplacement sur le disque. Vous devrez le prendre à partir de là ...

80
mvn install dependency:copy-dependencies 

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


35

Jetez un œil au plug - in de dépendance Maven , en particulier à l' objectif dependency: copy-dependencies . Jetez un œil à l'exemple sous le titre The dependency: copy-dependencies 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.


15
Alternativement, vous pouvez utiliser $ {project.build.directory} / lib plutôt que $ {basedir} / target / lib
Cuga

31

Une solution simple et élégante pour le cas où l'on a besoin de copier les dépendances dans un répertoire cible sans utiliser d'autres phases de maven (j'ai trouvé cela très utile lorsque l'on travaille avec Vaadin).

Exemple complet de pom:

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

Exécutez ensuite mvn process-sources

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


1
maven-dependency-plugin (objectifs "copie-dépendances", "décompresser") n'est pas pris en charge par m2e. :-(
PM

@Gobliins utilise $ {project.build.directory} / lib au lieu de $ {targetdirectory}
Divyang Shah

24

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

dépendance mvn: copie-dépendances -DoutputDirectory = $ {project.build.directory} / lib

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


Merci! c'est le moyen le plus simple de copier simplement les bibliothèques qui seraient requises par un projet dans un dossier quelque part afin que vous puissiez les copier ailleurs si nécessaire, par exemple un projet non basé sur Maven. Notez que bien sûr, vous pouvez simplement passer dans un dossier codé en dur à utiliser si vous le souhaitez, par exemplemvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

Pouvez-vous le faire à partir de pom.xml?
Gobliins

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>

@Thomas Je pense qu'il est maven clean install, alors vous trouverez libentarget
Searene

1
que dois-je faire pour copier une seule dépendance?
Alan Donizete

<classpathPrefix> lib / </classpathPrefix> m'a beaucoup aidé. Je vous remercie!
Martin Pabst

Remplacerait la installphase par process-resourcesafin que les dépendances soient copiées avant la buildfin du but
Vyacheslav Cotruta

20

Tout ce dont vous avez besoin est l'extrait de code suivant dans 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écutera dans la packagephase lorsque vous exécutez

mvn clean package

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

Si vous ne souhaitez le faire qu'occasionnellement, aucune modification de pom.xml n'est requise. Exécutez simplement ce qui suit:

mvn clean package dependency:copy-dependencies

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

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

7

supposant

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

voici ce qui a fonctionné pour moi:

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

5

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

La configuration suivante générera des scripts pour Windows et Linux pour lancer l'application (avec un chemin généré faisant référence à tous les pots de dépendance, téléchargez toutes les dépendances (dans un dossier lib sous target / appassembler). Le plugin d'assemblage peut ensuite être utilisé pour empaqueter l'ensemble répertoire appassembler vers un zip qui est installé / déployé avec le pot 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 d'assembly (dans src / main / assembly) pour empaqueter le direcotry sous forme de zip serait:

<assembly>
  <id>archive</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>

2

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



1

Juste pour expliquer brièvement ce qui a déjà été dit. Je voulais créer un fichier JAR exécutable qui comprenait 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) Exécution de l'assembly de compilation mvn: l'assembly a produit 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 JAR avec java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar


classe principale non trouvée dans (3)
Thomas

1

C'est une solution lourde pour intégrer de fortes dépendances, mais le plugin d'assemblage de Maven fait l'affaire pour moi.

La réponse de @ Rich Seller devrait fonctionner, mais pour les cas plus simples, vous ne devriez avoir 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>

Votre exemple de code ne résout pas le problème, il regroupe tout simplement dans un seul fichier JAR. Oui, le plugin d'assemblage peut être utilisé pour atteindre cet objectif, mais pas comme ça.
Duncan Jones

Bien que, à la suite de votre lecture, vous répondiez peut-être à ce commentaire .
Duncan Jones

ça fait si longtemps que je ne me souviens plus vraiment… en plus je suis devenu plutôt rouillé depuis que je me suis concentré sur l'administration Linux dans ma dernière entreprise - mais merci pour les commentaires!
RubyTuesdayDONO

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.