forzare Maven a copiare le dipendenze in target / lib


252

Come posso copiare le dipendenze di runtime del mio progetto nella target/libcartella?

Come è adesso, dopo che mvn clean installla targetcartella contiene solo il vaso del mio progetto, ma nessuna delle dipendenze di runtime.


Perchè ti serve ? Qual è il tipo del tuo progetto maven? vaso ?
Alexandre Victoor,

Il tipo del mio progetto maven è JAR. Ne ho bisogno perché ci sono molte dipendenze e sto provando a distribuire il vaso come eseguibile.
Michael,

2
Attenzione agli assiemi: se si hanno pacchetti / classi sovrapposti tra i deps, probabilmente si avrà un brutto momento.
demaniak,

Risposte:


260

Questo funziona per me:

<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
Se vuoi che ciò accada sempre, rimuovi i wrapper <profile> ... <profilo> e fai in modo che il tag <build> sia appena sotto <progetto>
Dan Halbert,

3
@Georgy questo non fa schifo i barattoli in lib /, ma include le classi nel progetto compilato
Midhat,

5
Questo va bene, ma sta copiando anche le dipendenze dei test. Aggiungo a me stesso l' excludeScopeopzione ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Alfonso Nishikawa,

Funziona bene ma non è necessario posizionare il tag build all'interno dei tag del profilo.
Julien BRENELIERE,

2
Nota: <excludeScope>test</excludeScope>va all'interno del configurationnodo.
Jesse Chisholm,

84

L'approccio migliore dipende da cosa vuoi fare:

  • Se vuoi raggruppare le tue dipendenze in un file WAR o EAR, imposta semplicemente il tipo di packaging del tuo progetto su EAR o WAR. Maven raggrupperà le dipendenze nella giusta posizione.
  • Se si desidera creare un file JAR che includa il codice insieme a tutte le dipendenze, utilizzare il plug-in di assembly con il descrittore jar-with-dependencies . Maven genererà un file JAR completo con tutte le tue classi più le classi da qualsiasi dipendenza.
  • Se si desidera semplicemente trascinare le dipendenze nella directory di destinazione in modo interattivo, utilizzare il plug-in delle dipendenze per copiare i file.
  • Se vuoi inserire le dipendenze per qualche altro tipo di elaborazione, probabilmente dovrai generare il tuo plugin. Esistono API per ottenere l'elenco delle dipendenze e la loro posizione sul disco. Dovrai prenderlo da lì ...

80
mvn install dependency:copy-dependencies 

Funziona per me con la directory delle dipendenze creata nella cartella di destinazione. Mi piace!



31

Una soluzione semplice ed elegante per il caso in cui è necessario copiare le dipendenze in una directory di destinazione senza utilizzare altre fasi di Maven (l'ho trovato molto utile quando si lavora con Vaadin).

Esempio di pom completo:

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

Quindi corri mvn process-sources

Le dipendenze del file jar sono disponibili in /target/dependency


1
maven-dependency-plugin (obiettivi "copia-dipendenze", "decomprimere") non è supportato da m2e. :-(
PM

@Gobliins usa $ {project.build.directory} / lib invece di $ {targetdirectory}
Divyang Shah

24

Se vuoi farlo occasionalmente (e quindi non vuoi cambiare il tuo POM), prova questa riga di comando:

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

Se si omette l' ultimo argomento , vengono inserite le dipendenze target/dependencies.


Grazie! questo è il modo più semplice per copiare le librerie che sarebbero richieste da un progetto in una cartella da qualche parte in modo da poterle copiare da qualche altra parte, se necessario, ad esempio un progetto non basato su maven. Nota che ovviamente puoi semplicemente passare in una cartella hardcoded da usare se vuoi, ad esempiomvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

Puoi farlo con pom.xml?
Gobliins,

24

Prova qualcosa del genere:

<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 Penso che sia maven clean install, quindi lo troverai libintarget
Searene il

1
cosa dovrei fare per copiare solo 1 dipendenza?
Alan Donizete,

<classpathPrefix> lib / </classpathPrefix> mi ha aiutato molto. Grazie!
Martin Pabst,

Sostituirebbe la installfase in process-resourcesmodo che le dipendenze vengano copiate prima che il buildgoal
venga

20

Tutto ciò di cui hai bisogno è il seguente frammento all'interno di 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>

Quanto sopra verrà eseguito nella packagefase quando si esegue

mvn clean package

E le dipendenze verranno copiate nella directory di output specificata nello snippet, ovvero libin questo caso.

Se lo desideri solo occasionalmente, non sono necessarie modifiche a pom.xml. Esegui semplicemente quanto segue:

mvn clean package dependency:copy-dependencies

Per sovrascrivere il percorso predefinito, ovvero ${project.build.directory}/dependenciesaggiungere una proprietà di sistema denominata outputDirectory, ad es

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

7

Supponendo

  • non vuoi modificare il pom.xml
  • non si desidera eseguire l'ambito del test (ad es. junit.jar) o le dipendenze fornite (ad es. wlfullclient.jar)

ecco cosa ha funzionato per me:

mvn install dependency: copy-dependencies -DincludeScope = runtime -DoutputDirectory = target / lib

5

Se vuoi consegnare un bundle del tuo jar dell'applicazione, insieme a tutte le sue dipendenze e alcuni script per invocare la MainClass, guarda appassembler-maven-plugin .

La seguente configurazione genererà script per Windows e Linux per avviare l'applicazione (con un percorso generato che fa riferimento a tutti i barattoli delle dipendenze, scarica tutte le dipendenze (in una cartella lib sotto target / appassembler). Il plugin di assemblaggio può quindi essere utilizzato per impacchettare l'intero directory appassembler in un file zip che viene installato / distribuito insieme al jar nel repository.

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

Il descrittore di assembly (in src / main / assembly) per impacchettare la directory come zip sarebbe:

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

2

Se rendi il tuo progetto una guerra o un tipo di orecchio, la copia copierà le dipendenze.



1

Giusto per precisare ciò che è già stato detto in breve. Volevo creare un file JAR eseguibile che includesse le mie dipendenze insieme al mio codice. Questo ha funzionato per me:

(1) Nel pom, sotto <build> <plugins>, ho incluso:

<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) Esecuzione dell'assieme di compilazione mvn: assembly ha prodotto il desiderato my-project-0.1-SNAPSHOT-jar-with-dependencies.jar nella directory di destinazione del progetto.

(3) Ho eseguito il JAR con java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar


classe principale non trovata in (3)
Thomas

1

È una soluzione pesante per incorporare dipendenze pesanti, ma il plugin di assemblaggio di Maven fa il trucco per me.

@ Risposta di Rich venditore dovrebbe funzionare, anche se per i casi più semplici si deve solo bisogno di questo estratto dalla guida utilizzo :

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

Il tuo esempio di codice non risolve il problema, raggruppa tutto in un unico JAR. Sì, il plug-in di assembly può essere utilizzato per raggiungere questo obiettivo, ma non in questo modo.
Duncan Jones,

Sebbene, leggendo ulteriormente, forse stai rispondendo a questo commento .
Duncan Jones,

è passato così tanto tempo che non ricordo davvero ... in più sono diventato piuttosto arrugginito da quando mi sono concentrato sull'amministrazione Linux nella mia ultima azienda - ma grazie per il feedback!
RubyTuesdayDONO,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.