Apa perbedaan maven antara tag dependensi dan plugin di pom xml?

118

Saya baru mengenal alat maven, saya telah membuat proyek dengan Spring dan Hibernate dan mereka dikonfigurasi di pom.xml sebagai plugin, tetapi JUnit ditandai di bawah ketergantungan. Pertanyaan saya adalah apa logika di balik satu sebagai plugin dan satu sebagai ketergantungan?

Karang
sumber

Jawaban:

213

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!

r9891
sumber
Bisakah saya memberi tahu saya apa perbedaan antara fase dan tujuan dalam eksekusi ?? Seperti yang saya tahu fase berbicara tentang siklus hidup maven .. tapi mengapa tujuan lagi? ada petunjuk? Kadang-kadang saya melihat orang memasukkan kata kunci siklus hidup pada tujuan ... ??? (?.?)
taymedee
@taymedee pertanyaan SO ini menjelaskan perbedaannya: stackoverflow.com/questions/16205778/…
dev_feed
1
@ r981 Jawaban Anda harus lebih jelas. Jawaban ini lebih baik: stackoverflow.com/questions/26292073/…
Ketidakkekalan Digital
Saya pikir poin yang terlewat dari jawaban ini adalah: dependensi tingkat atas terutama digunakan oleh artefak Anda, bukan plugin.
Gratis
3
@MichaelPacheco, Yang saya maksud adalah, plugin musim semi akan melakukan tugas tertentu untuk menjalankan serangkaian kode, yang mungkin bergantung pada beberapa pustaka, yang akan ditentukan oleh 'ketergantungan'. Ambil contoh yang berbeda: Anda membutuhkan kompiler untuk mengeksekusi sebuah kode; Di sini, kompiler Anda adalah plugin dan kode Anda dapat dieksekusi. Kompilator Anda sendiri mampu mengeksekusi kode apa pun, tetapi kode Anda mungkin bergantung pada pustaka, katakanlah apache commons, yang akan menjadi dependensi. Kompilator Anda hanya dapat mengompilasi kode jika dependensi ada di classpath. Saya harap sudah jelas sekarang.
r9891
37

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.

Andrew Logvinov
sumber
terima kasih atas balasan cepatnya, maaf tapi saya masih bingung karena saya tahu JUnit juga merupakan kerangka kerja dan (hibernate, spring) juga hanya menggunakan framework, jadi itu berarti dalam kasus (hibernate, spring) juga dapat dikonfigurasi dalam tag dependensi ? saya harap Anda mendapatkan pertanyaan saya.
Coral
Ya, dan sejauh yang saya tahu tidak ada yang namanya plugin Spring maven. Biasanya, Spring libs (atau Hibernate, atau JUnit, atau TestNG, dll.) Dideklarasikan sebagai dependensi untuk project Anda. Jika Anda baru mengenal maven, saya sarankan untuk membaca buku yang sangat bagus ini.
Andrew Logvinov
@AndrewLogvinov - Saya memiliki proyek multi pom untuk pengujian otomatisasi api. Salah satu proyek maven memiliki tes otomasi. Bagian build dari project pom hanya memiliki 1 plugin - maven surefire plugin dengan referensi ke suite. Seluruh tag build telah dihapus. Bisakah Anda memberi tahu saya apa artinya ini? Terima kasih.
MasterJoe
15

Plugin dan dependensi adalah hal yang sangat berbeda dan saling melengkapi.

Plugin apa itu?

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 :

  • Plugin build akan dijalankan selama build dan harus dikonfigurasi dalam <build/>elemen dari POM.
  • Plugin pelaporan akan dijalankan selama pembuatan situs dan harus dikonfigurasi di <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 apa itu?

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>
davidxxx
sumber
penjelasan yang bagus !, karena saya tidak mahir mengatur dependensi di Java, saya masih ragu, saya saat ini bekerja di IntelliJ, dan membuat proyek maven, ketika saya mencoba memasukkan 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?
Anu
1
Sulit untuk memberikan jawaban yang paling tepat tanpa melihat Anda 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)
davidxxx
1
Perhatikan bahwa ini adalah cara yang buruk untuk menentukan plugin. Itu tidak membuat build Anda dapat direproduksi dari waktu ke waktu ( cwiki.apache.org/confluence/display/MAVEN/… ). Anda akan melihat peringatan di build. Jadi "apa bedanya?". Plugin menjalankan tugas untuk build Maven sementara dependensi adalah library (jar atau apa pun) yang diperlukan di classpath selama build. Jika build proyek Anda sama apa pun masalahnya (menggunakan pustaka atau cara plugin), itu berarti plugin tersebut tidak berdaya karena tidak digunakan. (2/2)
davidxxx
6

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.

Kevin
sumber
4

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 .

coffeMug
sumber
1

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) 
Himanshu Ahuja
sumber
1

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

Yogesh Rathi
sumber
0

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.

plugin dan ketergantungan

DeC
sumber