Mengunduh semua dependensi pakar ke direktori TIDAK dalam repositori?

127

Saya mulai mengubah proyek saya menjadi pakar karena saya perlu menggunakan perpustakaan yang didistribusikan dalam bentuk biner di atas pakar saja, tetapi setelah membenturkan kepala ke dinding terlalu lama, saya memutuskan untuk berhenti melukai diri sendiri dan hanya menggunakan Semut. Saya ingin maven mengunduh toples dan semua dependensi transitifnya ke dalam direktori yang saya pilih jadi saya bisa memeriksanya ke dalam SCM saya karena saya biasanya menikmati dan menjadi pengembang yang bahagia sekali lagi.
Adakah ide bagaimana melakukannya dengan mudah?

chubbsondubs
sumber
2
Pertimbangkan untuk menggunakan Ivy dan dapatkan manajemen ketergantungan transitif yang Anda butuhkan, dengan Semut yang Anda percayai. Atau gigit peluru dan gunakan struktur direktori Maven.
Dave Newton
Sudahkah Anda mencoba Ivy ?
Tomasz Nurkiewicz
5
Tidak, tapi saya sudah menghabiskan semua kesabaran saya dengan beralih pada saat ini. Mungkin lain kali. Saya ingin kembali ke pengkodean. Bisakah itu dilakukan dengan pakar?
chubbsondubs

Jawaban:

260

The maven ketergantungan Plugin berpotensi dapat memecahkan masalah Anda.

Jika Anda memiliki pomsemua dependensi proyek yang ditentukan, yang perlu Anda lakukan adalah menjalankan

mvn dependency:copy-dependencies

dan Anda akan menemukan target/dependenciesfolder diisi dengan semua dependensi, termasuk transitif.

Menambahkan jawaban Gustavo dari bawah : Untuk mengunduh sumber-sumber ketergantungan , Anda dapat menggunakan

mvn dependency:copy-dependencies -Dclassifier=sources

(via Apache Maven Dependency Plugin doc ).

Raghuram
sumber
1
Thx @Raghuram, saya sudah mencari ini sejak lama.
eskalera
tetapi bagaimana jika saya ingin menyalin semua dependensi ke repo lokal saya? Ini seharusnya digunakan untuk apa? Mengapa menyalin jika mungkin sudah di repo lokal. Itu adalah lokal.
ses
1
@ses Standar pakar bangunan (mis. kompilasi, pengujian, paket, instal, dll.; tidak yakin tentang validasi) sudah menyalin semua dependensi ke repo lokal Anda secara default. Ini bukan untuk itu. Sebaliknya itu untuk situasi di mana Anda membutuhkan dependensi aplikasi Anda untuk alasan apa pun. Saya menggunakannya saat ini untuk memeriksa pustaka dependen untuk definisi API yang berlebihan (mis. Beberapa pustaka akan menyertakan Javax API, yang dapat bertentangan dengan versi lain dari API yang sama), tetapi ada baiknya juga jika aplikasi Anda membutuhkan dependensi yang dipaket dengan itu. untuk distribusi, atau apa saja.
Spanky Quigman
1
+1 untuk jawaban yang jelas, singkat dan bermanfaat. Saya baru saja melalui tarian Maven yang sama dengan OP dan hanya ingin mengambil dependensi file JAR. Terima kasih! Saya berharap saya bisa +10
Brandon
@Raghuram Secara teknis Anda berakhir dengan semua artefak (diselesaikan) dalam "target / dependensi". Lebih lanjut, ada potensi masalah tabrakan nama karena koordinat "groupId" dari dependensi diabaikan. Dengan kata lain, "dependensi: salin-dependensi" tidak mempertahankan struktur tata letak.
whaefelinger
8

Berdasarkan jawaban @Raghuram , saya menemukan tutorial tentang Menyalin dependensi proyek , Cukup:

  1. Buka pom.xmlfile proyek Anda dan temukan ini:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
  2. Kemudian ganti <plugins> ... </plugins>dengan:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  3. Dan memanggil pakar dalam garis perintah mvn dependency:copy-dependencies

Setelah selesai, itu akan membuat folder di target/dependencydalam semua jardependensi pada direktori saat ini di mana pom.xmltinggal.

pengguna
sumber
Di mana saya mengetik perintah "mvn"? Klik kanan maven-project-> Maven -> .. ??
Baked Inhalf
Pada baris perintah terminal pada folder di mana pom.xmlfile aktif.
pengguna
1
Tidak bekerja Saya pikir Maven diinstal sebagai plugin saja. Saya juga harus mengunduh Maven secara manual. Kemudian mvn dependency:copy-dependenciesberhasil!
Baked Inhalf
8

Saya akhirnya menemukan cara menggunakan Maven. Dari dalam Eclipse, buat proyek Maven baru.

Unduh Maven, ekstrak arsip, tambahkan /binfolder ke jalur.

Validasi instal dari command-line dengan menjalankan mvn -v(akan mencetak versi dan java install path)

Ubah ke folder root proyek (di mana pom.xmlberada) dan jalankan:

mvn dependency:copy-dependencies

Semua file jar diunduh ke /target/dependency.

Untuk mengatur direktori keluaran lain:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

Sekarang dimungkinkan untuk menggunakan kembali proyek Maven ini untuk semua unduhan ketergantungan dengan mengubah pom.xml

Tambahkan toples ke proyek java dengan build path -> configure build path -> libraries -> add JARs ..

Inhalf panggang
sumber
1
Tidak harus menjadi proyek gerhana. Saya membuka file jar di Java Decompiler dan menyalin pom.xml ke folder kosong. Saya menelepon mvn dependency:copy-dependenciessaat Anda menjelaskan dari folder itu dan mendapatkan semua file jar yang tergantung disalin dengan baik ke satu folder.
Bernhard Döbler
4

Saya menemukan perintah selanjutnya

mvn dependency:copy-dependencies -Dclassifier=sources

di sini maven.apache.org

Gustavo
sumber
2

Silakan periksa apakah Anda memiliki beberapa file konfigurasi dalam ${MAVEN_HOME}/confdirektori seperti settings.xml. File-file itu mengabaikan pengaturan dari .m2folder dan karena itu, folder repositori dari .m2mungkin tidak terlihat atau dibuang.

MagGGG
sumber