memaksa Maven untuk menyalin dependensi ke target / lib


252

Bagaimana cara saya mendapatkan dependensi runtime proyek saya disalin ke target/lib folder?

Seperti yang sekarang, setelah mvn clean installsatu targetfolder hanya jar proyek saya, tapi tidak ada dependensi runtime.


Mengapa Anda membutuhkan ini? Apa jenis proyek pakar Anda? toples?
Alexandre Victoor

Jenis proyek pakar saya adalah JAR. Saya memerlukan ini karena ada banyak dependensi dan saya mencoba menggunakan toples sebagai executable.
Michael

2
Perhatian dengan majelis - jika Anda memiliki paket / kelas yang tumpang tindih antara deps, Anda mungkin akan memiliki waktu yang buruk.
demaniak

Jawaban:


260

Ini bekerja untuk saya:

<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
Jika Anda ingin ini terjadi setiap saat, hapus pembungkus <profil> ... <profil> dan buat tag <build> tepat di bawah <project>
Dan Halbert

3
@ Georgy ini tidak menyembunyikan stoples di lib /, tetapi termasuk kelas-kelas dalam proyek yang dikompilasi
Midhat

5
Ini baik-baik saja, tetapi juga menyalin dependensi pengujian. Saya menambahkan sendiri excludeScopeopsi ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Alfonso Nishikawa

Bekerja dengan baik tetapi tidak perlu menempatkan tag build di dalam tag profil.
Julien BRENELIERE

2
Catatan: <excludeScope>test</excludeScope>masuk ke dalam configurationsimpul.
Jesse Chisholm

84

Pendekatan terbaik tergantung pada apa yang ingin Anda lakukan:

  • Jika Anda ingin menggabungkan dependensi Anda menjadi file WAR atau EAR, maka cukup atur jenis kemasan proyek Anda ke EAR atau WAR. Maven akan membundel dependensi ke lokasi yang tepat.
  • Jika Anda ingin membuat file JAR yang menyertakan kode Anda beserta semua dependensi Anda, gunakan plugin assembly dengan deskriptor jar-dengan-dependensi . Maven akan menghasilkan file JAR lengkap dengan semua kelas Anda ditambah kelas dari dependensi apa pun.
  • Jika Anda ingin menarik dependensi Anda ke direktori target secara interaktif, gunakan plugin dependensi untuk menyalin file Anda.
  • Jika Anda ingin menarik dependensi untuk beberapa jenis pemrosesan lain, maka Anda mungkin perlu membuat plugin sendiri. Ada API untuk mendapatkan daftar dependensi, dan lokasinya pada disk. Anda harus mengambilnya dari sana ...

80
mvn install dependency:copy-dependencies 

Bekerja untuk saya dengan direktori dependensi yang dibuat di folder target. Suka itu!



31

Solusi sederhana dan elegan untuk kasus di mana seseorang perlu menyalin dependensi ke direktori target tanpa menggunakan fase pakar lain (saya menemukan ini sangat berguna ketika bekerja dengan Vaadin).

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

Lalu lari mvn process-sources

Ketergantungan file jar dapat ditemukan di /target/dependency


1
maven-dependency-plugin (tujuan "copy-dependensi", "membongkar") tidak didukung oleh m2e. :-(
PM

@Gobliins menggunakan $ {project.build.directory} / lib alih-alih $ {targetdirectory}
Divyang Shah

24

Jika Anda ingin melakukan ini secara berkala (dan karena itu tidak ingin mengubah POM Anda), coba baris perintah ini:

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

Jika Anda menghilangkan argumen terakhir , dependensi ditempatkan target/dependencies.


Terima kasih! ini adalah cara termudah untuk hanya menyalin lib yang diperlukan oleh suatu proyek ke dalam folder di suatu tempat sehingga Anda dapat menyalinnya di tempat lain jika perlu, misalnya proyek yang bukan berbasis pakar. Perhatikan bahwa tentu saja Anda bisa memasukkan dalam folder hardcode untuk digunakan jika Anda suka, misalnyamvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

Bisakah Anda melakukannya dari pom.xml?
Goblin

24

Coba sesuatu seperti ini:

<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 Saya pikir itu maven clean install, maka Anda akan menemukannya libditarget
Searene

1
apa yang harus saya lakukan untuk menyalin hanya 1 ketergantungan?
Alan Donizete

<classpathPrefix> lib / </classpathPrefix> banyak membantu saya. Terima kasih!
Martin Pabst

Akan mengganti installfase dengan process-resourcessehingga dependensi disalin sebelum buildtujuan berjalan
Vyacheslav Cotruta

20

Yang Anda butuhkan adalah cuplikan berikut di dalam pom.xml's 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>

Di atas akan berjalan pada packagefase ketika Anda menjalankan

mvn clean package

Dan dependensi akan disalin ke direktori output yang ditentukan dalam snippet, yaitu lib dalam hal ini.

Jika Anda hanya ingin melakukannya sesekali, maka tidak ada perubahan ke pom.xml diperlukan. Cukup jalankan yang berikut ini:

mvn clean package dependency:copy-dependencies

Untuk mengganti lokasi default, yaitu ${project.build.directory}/dependencies, tambahkan properti Sistem bernama outputDirectory, yaitu

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

7

seandainya

  • Anda tidak ingin mengubah pom.xml
  • Anda tidak ingin uji cakupan (mis. junit.jar) atau dependensi yang diberikan (mis. wlfullclient.jar)

inilah yang bekerja untuk saya:

mvn instal dependensi: copy-dependensi -DincludeScope = runtime -DoutputDirectory = target / lib

5

Jika Anda ingin mengirimkan satu bundel toples aplikasi Anda, bersama dengan semua dependensinya dan beberapa skrip untuk menjalankan MainClass, lihat appassembler-maven-plugin .

Konfigurasi berikut akan menghasilkan skrip untuk Window dan Linux untuk meluncurkan aplikasi (dengan jalur yang dihasilkan merujuk semua guci ketergantungan, unduh semua dependensi (ke folder lib di bawah target / appassembler). Plugin perakitan kemudian dapat digunakan untuk mengemas keseluruhan direktori appassembler ke zip yang diinstal / ditempatkan bersama dengan jar ke repositori.

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

Descriptor assembly (dalam src / main / assembly) untuk mengemas direcotry sebagai zip adalah:

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

2

Jika Anda membuat proyek Anda seorang pakar perang atau jenis telinga akan menyalin dependensinya.



1

Hanya untuk menguraikan apa yang sudah dikatakan secara singkat. Saya ingin membuat file JAR yang dapat dieksekusi yang menyertakan dependensi saya bersama dengan kode saya. Ini bekerja untuk saya:

(1) Dalam pom, di bawah <build> <plugins>, saya memasukkan:

<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) Menjalankan rakitan kompilasi mvn: rakitan menghasilkan my-project-0.1-SNAPSHOT-jar-with-dependencies.jar yang ada di direktori target proyek.

(3) Saya menjalankan JAR dengan java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar


kelas utama tidak ditemukan dalam (3)
Thomas

1

Ini solusi berat untuk menanamkan dependensi berat, tetapi Maven's Assembly Plugin melakukan trik untuk saya.

@ Jawaban Penjual Kaya harus berfungsi, meskipun untuk kasus yang lebih sederhana, Anda hanya perlu kutipan ini dari panduan penggunaan :

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

Contoh kode Anda tidak menyelesaikan masalah, itu hanya bundel semuanya menjadi satu JAR. Ya, plugin perakitan dapat digunakan untuk mencapai tujuan ini, tetapi tidak seperti ini.
Duncan Jones

Meskipun, pada bacaan lebih lanjut, mungkin Anda merespons komentar ini .
Duncan Jones

sudah begitu lama sehingga saya tidak begitu ingat ... ditambah lagi saya sudah agak berkarat sejak berfokus pada administrasi Linux di perusahaan terakhir saya - tetapi terima kasih atas umpan baliknya!
RubyTuesdayDONO

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.