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-plugindan 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 builddan reportingplugins :
<build/>elemen dari POM.<reporting/> elemen dari POM. Menurut tujuan maven yang ditentukan di baris perintah (misalnya mvn clean, mvn clean packageatau mvn site), gaya hidup tertentu akan digunakan dan serangkaian tujuan plugin tertentu akan dijalankan.
Ada tiga built-in membangun siklus hidup: default, cleandan site. The defaultsiklus hidup menangani penyebaran proyek Anda, cleanmenangani siklus hidup proyek pembersihan, sementara sitemenangani siklus hidup penciptaan proyek Anda dokumentasi situs.
Sasaran plugin mungkin terikat pada fase tertentu dari gaya hidup tertentu.
Misalnya maven-compiler-pluginmengikat secara default compiletujuan 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 scopebawah).
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 managementsebagian atau masih dalam sebuah plugindeklarasi ! 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 plugindan dependencymungkin 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 ( JARsecara default) tidak secara umum ditentukan. Jadi format umum di dependencydeklarasi 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 compilelingkup 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 compiledependensi 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 testruang 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-iesaya memiliki dua opsi, baik memasukkannya sebagai pluginsatau dependency, saya menyertakan keduanya untuk membandingkan, & mengamati keduanya memiliki groupIdperbedaan yang persis sama , satu-satunya perbedaan adalah bahwa keduanya pluginstidak datang dengan versi tertentu tetapi dependencydatang 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 Mavendirinya sendiri (seperti menambahkan eclipsedukungan atau SpringBootdukungan ke Mavendll.). Ketergantungan diperlukan oleh kode sumber Anda untuk melewati fase Maven apa pun ( compileatau testmisalnya). Dalam kasus JUnitsejak kode uji pada dasarnya adalah bagian dari basis kode Anda dan Anda memanggil JUnitperintah tertentu di dalam test suite dan perintah-perintah tersebut tidak disediakan oleh Java SDKkarena itu JUnitharus hadir pada saat itu Mavenadalah dalam tahap pengujian dan ini ditangani dengan menyebutkan JUnitsebagai dependensi di pom.xmlfile 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 etcuntuk 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.