Jawaban:
Baik plugin dan dependensi adalah file Jar.
Namun perbedaan di antara keduanya adalah, sebagian besar pekerjaan di maven dilakukan dengan menggunakan plugin; sedangkan ketergantungan hanyalah sebuah file Jar yang akan ditambahkan ke classpath saat menjalankan tugas.
Misalnya, Anda menggunakan compiler-plugin untuk mengompilasi file java. Anda tidak dapat menggunakan compiler-plugin sebagai dependensi karena itu hanya akan menambahkan plugin ke classpath, dan tidak akan memicu kompilasi apa pun. File Jar yang akan ditambahkan ke classpath saat mengompilasi file, akan ditentukan sebagai dependensi.
Sama halnya dengan skenario Anda. Anda harus menggunakan spring-plugin untuk menjalankan beberapa spring executable [Saya tidak yakin untuk apa spring-plugins digunakan. Saya hanya menebak-nebak di sini]. Tetapi Anda membutuhkan dependensi untuk menjalankan executable tersebut. Dan Junit diberi tag di bawah ketergantungan karena digunakan oleh plugin yang pasti untuk menjalankan pengujian unit.
Jadi, bisa dikatakan, plugin adalah file Jar yang menjalankan tugas, dan dependensi adalah Jar yang menyediakan file kelas untuk menjalankan tugas.
Semoga itu menjawab pertanyaan Anda!
Maven sendiri dapat digambarkan sebagai food processor yang memiliki banyak unit berbeda yang dapat digunakan untuk menyelesaikan berbagai tugas. Unit tersebut disebut plugin. Misalnya, untuk mengompilasi project maven Anda gunakan maven-compiler-plugin
, untuk menjalankan pengujian - maven-surefire-plugin
dan seterusnya.
Ketergantungan dalam istilah maven adalah bagian paket dari kelas yang bergantung pada proyek Anda. Bisa jadi jar, war, dll. Misalnya, jika Anda ingin menulis pengujian JUnit, Anda harus menggunakan anotasi dan class JUnit sehingga Anda harus mendeklarasikan bahwa project Anda bergantung pada JUnit.
Plugin dan dependensi adalah hal yang sangat berbeda dan saling melengkapi.
Plugin melakukan tugas untuk build Maven. Ini tidak dikemas dalam aplikasi.
Inilah jantung Maven.
Setiap tugas yang dijalankan oleh Maven dilakukan oleh plugin .
Ada dua kategori plugin: the build
dan reporting
plugins :
<build/>
elemen dari POM.<reporting/
> elemen dari POM. Menurut tujuan maven yang ditentukan di baris perintah (misalnya mvn clean
, mvn clean package
atau mvn site
), gaya hidup tertentu akan digunakan dan serangkaian tujuan plugin tertentu akan dijalankan.
Ada tiga built-in membangun siklus hidup: default
, clean
dan site
. The default
siklus hidup menangani penyebaran proyek Anda, clean
menangani siklus hidup proyek pembersihan, sementara site
menangani siklus hidup penciptaan proyek Anda dokumentasi situs.
Sasaran plugin mungkin terikat pada fase tertentu dari gaya hidup tertentu.
Misalnya maven-compiler-plugin
mengikat secara default compile
tujuan untuk fase siklus hidup: compile
.
Sebagian besar plugin maven (baik plugin inti maupun plugin pihak ketiga) lebih menyukai konvensi daripada konfigurasi. Jadi ini umumnya mengikat tujuan plugin ke fase tertentu untuk membuat penggunaannya lebih sederhana.
Itu lebih rapi dan lebih sedikit rawan kesalahan:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
dari:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
Dependensi adalah artefak / komponen Maven yang diperlukan di classpath selama pembuatan Maven.
Ini mungkin dikemas dalam aplikasi tetapi belum tentu (lihat di scope
bawah).
Sebagian besar dependensi adalah jar tetapi ini mungkin juga jenis arsip lain: war, ear, test-jar, ejb-client ... atau masih POM atau BOM.
Dalam pom.xml sebuah, dependensi dapat ditentukan di beberapa tempat: <build><dependencies>
sebagian, dependencies management
sebagian atau masih dalam sebuah plugin
deklarasi ! Memang beberapa plugin mungkin perlu memiliki beberapa dependensi di classpath selama eksekusinya. Itu tidak umum tetapi itu mungkin terjadi.
Berikut adalah contoh dari dokumentasi yang menunjukkan bahwa plugin
dan dependency
mungkin bekerja sama:
Misalnya, Plugin Maven Antrun versi 1.2 menggunakan Ant versi 1.6.5, jika Anda ingin menggunakan versi Ant terbaru saat menjalankan plugin ini, Anda perlu menambahkan
<dependencies>
elemen seperti berikut:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
...
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
...
</project>
Di Maven, dependensi dirujuk dalam format tertentu:
groupId:artifactId:packaging:classifier:version
.
Pengklasifikasi (yang opsional) dan pengemasan ( JAR
secara default) tidak secara umum ditentukan. Jadi format umum di dependency
deklarasi agak: groupId:artifactId:version
.
Berikut adalah contoh dependensi yang dideklarasikan di <build><dependencies>
bagian:
<build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.14.Final</version>
</dependency>
<dependencies>
</build>
Berlawanan dengan plugin, dependensi memiliki cakupan.
Cakupan default adalah compile
. Itu adalah cakupan yang paling umum dibutuhkan (konvensi ulang konfigurasi lagi).
The compile
lingkup berarti bahwa ketergantungan tersedia di semua calsspath proyek.
Scope menentukan di mana classpaths dependensi harus ditambahkan. Misalnya, apakah kita membutuhkannya saat kompilasi dan runtime, atau hanya untuk pengujian kompilasi dan eksekusi?
Misalnya kami sebelumnya mendefinisikan Hibernate sebagai compile
dependensi seperti yang kami butuhkan di mana-mana: kompilasi sumber, kompilasi pengujian, runtime, dan sebagainya ....
Tetapi kami tidak ingin pustaka pengujian dipaketkan dalam aplikasi atau direferensikan dalam kode sumber . Jadi kami menentukan test
ruang lingkupnya:
<build>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>
<dependencies>
</build>
webdriver-ie
saya memiliki dua opsi, baik memasukkannya sebagai plugins
atau dependency
, saya menyertakan keduanya untuk membandingkan, & mengamati keduanya memiliki groupId
perbedaan yang persis sama , satu-satunya perbedaan adalah bahwa keduanya plugins
tidak datang dengan versi tertentu tetapi dependency
datang dengan 0.6.685
. Bisakah Anda menjelaskannya secara awam (dalam kaitannya dengan contoh ini) istilah apa bedanya, mana yang akan digunakan kapan. Ada saran?
pom.xml
. Tetapi satu hal yang menarik bagi Anda adalah bahwa menentukan versi dependensi adalah wajib (di pom saat ini atau di pom induk jika itu adalah dependensi yang diwariskan) di versi Maven mana pun sementara sejak Maven 3 (mungkin ide bagus yang buruk sebagai fitur), menentukan versi plugin adalah opsional. Maven akan menggunakan versi terakhir yang tersedia di repositori rilis tempat Maven menemukannya. (1/2)
Jika Anda berasal dari latar belakang front-end seperti saya, dan terbiasa dengan Grunt dan npm, pikirkan seperti ini:
Pertama Anda akan lari, katakanlah npm install grunt-contrib-copy --save-dev
,. Ini seperti milik maven <dependency></dependency>
. Ini mengunduh file yang diperlukan untuk menjalankan tugas build.
Kemudian Anda akan mengonfigurasi tugas di Gruntfile.js
copy: {
main: {
src: 'src/*',
dest: 'dest/',
},
}
Ini seperti milik maven <plugin>/<plugin>
. Anda memberi tahu alat build apa yang harus dilakukan dengan kode yang diunduh oleh npm / <dependency></dependency>
.
Tentu saja ini bukan analogi yang tepat, tetapi cukup dekat untuk membantu membungkus kepala Anda di sekitarnya.
Plug-in digunakan untuk menambahkan fungsionalitas ke Maven
dirinya sendiri (seperti menambahkan eclipse
dukungan atau SpringBoot
dukungan ke Maven
dll.). Ketergantungan diperlukan oleh kode sumber Anda untuk melewati fase Maven apa pun ( compile
atau test
misalnya). Dalam kasus JUnit
sejak kode uji pada dasarnya adalah bagian dari basis kode Anda dan Anda memanggil JUnit
perintah tertentu di dalam test suite dan perintah-perintah tersebut tidak disediakan oleh Java SDK
karena itu JUnit
harus hadir pada saat itu Maven
adalah dalam tahap pengujian dan ini ditangani dengan menyebutkan JUnit
sebagai dependensi di pom.xml
file Anda .
Maven pada intinya adalah kerangka kerja eksekusi plugin - sesuai definisi ringkas formal dan standar. Untuk membuatnya lebih jelas, perintah yang Anda gunakan seperti maven-install/clean/compile/build etc
untuk membuat / mengeksekusi jars, yang terkadang kami jalankan juga secara manual. Jadi, hal-hal yang ingin Anda jalankan (atau konfigurasikan atau jalankan) pada dasarnya Anda taruh di tag dependensi mavens pom dan jawabannya siapa yang akan menjalankan dependensi ini (diperlukan untuk pengaturan lingkungan) adalah pluginnya.
javac (compiler) dependency.java (dependency)
Jawaban satu baris - pemahaman dasar
Plugin adalah alat yang Anda gunakan saat menjalankan build maven Anda
Ketergantungan berarti jenis pustaka apa pun yang akan Anda gunakan dalam kode Anda
Plugin adalah ekstensi untuk Maven, sesuatu yang digunakan untuk menghasilkan artefak Anda (misalnya maven-jar-plugin, digunakan untuk, Anda dapat menebaknya, membuat jar dari kelas dan resource yang Anda kompilasi).
Dependensi adalah pustaka yang dibutuhkan oleh aplikasi yang Anda buat, pada kompilasi dan / atau pengujian dan / atau waktu runtime.