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.

Michael
sumber
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>
Georgy Bolyuba
sumber
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 ...
John Stauffer
sumber
80
mvn install dependency:copy-dependencies 

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

pengguna3286149
sumber
35

Lihatlah plugin dependensi Maven , khususnya, dependensi: tujuan copy-dependensi . Lihatlah contoh di bawah judul Ketergantungan: copy-dependensi mojo . Setel properti konfigurasi outputDirectory ke $ {basedir} / target / lib (saya yakin, Anda harus menguji).

Semoga ini membantu.

Travis B. Hartwell
sumber
15
Atau, Anda dapat menggunakan $ {project.build.directory} / lib daripada $ {basedir} / target / lib
Cuga
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

ruhsuzbaykus
sumber
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.

Duncan Jones
sumber
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>
adjablon
sumber
@ 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
isapir
sumber
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
mambolis
sumber
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>
Penjual Kaya
sumber
2

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

Eduard Wirch
sumber
1

Anda dapat menggunakan Plugin Shade untuk membuat tabung uber di mana Anda dapat menggabungkan semua dependensi pihak ke-3 Anda.

Brian Matthews
sumber
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

OleVV
sumber
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>
RubyTuesdayDONO
sumber
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