Masalah pendekatan populer
Sebagian besar jawaban yang akan Anda temukan di internet akan menyarankan Anda untuk menginstal dependensi ke repositori lokal Anda atau menentukan cakupan "sistem" di pom
dan mendistribusikan dependensi dengan sumber proyek Anda. Tetapi kedua solusi ini sebenarnya cacat.
Mengapa Anda tidak harus menerapkan pendekatan "Instal ke Repo Lokal"
Ketika Anda menginstal dependensi ke repositori lokal Anda, itu tetap ada. Artefak distribusi Anda akan baik-baik saja asalkan memiliki akses ke repositori ini. Masalahnya adalah dalam kebanyakan kasus repositori ini akan berada di komputer lokal Anda, jadi tidak akan ada cara untuk menyelesaikan ketergantungan ini pada mesin lain. Jelas membuat artefak Anda bergantung pada mesin tertentu bukanlah cara untuk menangani berbagai hal. Kalau tidak, ketergantungan ini harus dipasang secara lokal pada setiap mesin yang bekerja dengan proyek itu yang tidak lebih baik.
Mengapa Anda tidak harus menerapkan pendekatan "Cakupan Sistem"
Guci yang Anda andalkan dengan pendekatan "Lingkup Sistem" tidak bisa diinstal ke repositori apa pun atau dilampirkan ke paket target Anda. Itu sebabnya paket distribusi Anda tidak akan memiliki cara untuk mengatasi ketergantungan itu ketika digunakan. Yang saya percaya adalah alasan mengapa penggunaan ruang lingkup sistem bahkan menjadi usang. Pokoknya Anda tidak ingin bergantung pada fitur usang.
Solusi repositori statis dalam proyek
Setelah meletakkan ini di pom
:
<repository>
<id>repo</id>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>file://${project.basedir}/repo</url>
</repository>
untuk setiap artefak dengan id grup bentuk x.y.z
Maven akan menyertakan lokasi berikut di dalam dir proyek Anda dalam pencariannya untuk artefak:
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
Untuk menjelaskan lebih lanjut tentang ini, Anda dapat membaca posting blog ini .
Gunakan Maven untuk menginstal ke proyek repo
Alih-alih membuat struktur ini dengan tangan, saya sarankan untuk menggunakan plugin Maven untuk menginstal guci Anda sebagai artefak. Jadi, untuk menginstal artifact ke repositori dalam-proyek di dalam repo
folder, jalankan:
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]
Jika Anda memilih pendekatan ini, Anda dapat menyederhanakan deklarasi repositori pom
menjadi:
<repository>
<id>repo</id>
<url>file://${project.basedir}/repo</url>
</repository>
Naskah pembantu
Karena mengeksekusi perintah instalasi untuk setiap lib agak menjengkelkan dan pasti rentan kesalahan, saya telah membuat skrip utilitas yang secara otomatis menginstal semua guci dari lib
folder ke repositori proyek, sementara secara otomatis menyelesaikan semua metadata (groupId, artifactId, dll.) Dari nama file. Script juga mencetak dependensi xml untuk Anda salin-tempel di pom
.
Sertakan dependensi dalam paket target Anda
Ketika repositori dalam-proyek Anda dibuat, Anda akan memecahkan masalah mendistribusikan dependensi proyek dengan sumbernya, tetapi sejak itu artefak target proyek Anda akan tergantung pada guci yang tidak dipublikasikan, jadi ketika Anda menginstal ke repositori ia akan memiliki dependensi yang tidak dapat dipecahkan.
Untuk mengatasi masalah ini, saya sarankan untuk memasukkan dependensi ini dalam paket target Anda. Ini dapat Anda lakukan dengan Plugin Majelis atau lebih baik dengan Plugin OneJar . Dokumentasi resmi tentang OneJar mudah dipahami.