it-swarm-id.com

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

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

77
Coral

Baik plugin dan dependensi adalah file Jar. 

Tetapi perbedaan di antara mereka adalah, sebagian besar pekerjaan di pakar dilakukan dengan menggunakan plugin; sedangkan dependensi hanyalah file Jar yang akan ditambahkan ke classpath saat menjalankan tugas. 

Misalnya, Anda menggunakan kompiler-plugin untuk mengkompilasi file Java. Anda tidak dapat menggunakan kompiler-plugin sebagai ketergantungan karena itu hanya akan menambahkan plugin ke classpath, dan tidak akan memicu kompilasi apa pun. File Jar yang akan ditambahkan ke classpath saat kompilasi file, akan ditentukan sebagai ketergantungan. 

Sama halnya dengan skenario Anda. Anda harus menggunakan pegas-plugin untuk mengeksekusi beberapa pegas executable [Saya tidak yakin untuk apa pegas-plugin digunakan. Saya hanya menebak di sini]. Tetapi Anda membutuhkan dependensi untuk menjalankan executable tersebut. Dan Junit ditandai di bawah dependensi karena digunakan oleh surefire-plugin untuk menjalankan tes unit.

Jadi, kita dapat mengatakan, plugin adalah file Jar yang mengeksekusi tugas, dan dependensi adalah Jar yang menyediakan file kelas untuk menjalankan tugas. 

Semoga itu menjawab pertanyaan Anda!

151
r9891

Maven sendiri dapat digambarkan sebagai food processor yang memiliki banyak unit berbeda yang dapat digunakan untuk menyelesaikan tugas yang berbeda. Unit-unit itu disebut plugin. Misalnya, untuk mengkompilasi pakar proyek Anda gunakan maven-compiler-plugin, untuk menjalankan tes - maven-surefire-plugin dan sebagainya.

Ketergantungan dalam hal pakar adalah paket kelas yang tergantung pada proyek Anda. Ini bisa berupa jar, perang dll. Misalnya, jika Anda ingin dapat menulis tes JUnit, Anda harus menggunakan anotasi dan kelas JUnit sehingga Anda harus menyatakan bahwa proyek Anda bergantung pada JUnit.

31
Andrew Logvinov

Plug-in digunakan untuk menambahkan fungsi ke Maven sendiri (seperti menambahkan dukungan Eclipse atau SpringBoot dukungan ke Maven dll.). Ketergantungan diperlukan oleh kode sumber Anda untuk melewati fase Maven (compile atau test misalnya). Dalam kasus JUnit karena kode uji pada dasarnya adalah bagian dari basis kode Anda dan Anda memanggil JUnit perintah khusus di dalam suite tes dan perintah-perintah tersebut tidak disediakan oleh Java SDK karena itu JUnit harus ada pada saat Maven sedang dalam tahap pengujian dan ini ditangani dengan menyebutkan JUnit sebagai ketergantungan pada file pom.xml Anda.

4
coffeMug

Jika Anda datang dari latar belakang front-end seperti saya, dan terbiasa dengan Grunt dan npm, pikirkan seperti ini:

Pertama, Anda akan menjalankan, katakanlah, npm install grunt-contrib-copy --save-dev. Ini seperti <dependency></dependency> maven. Itu mengunduh file yang diperlukan untuk menjalankan tugas membangun.

Maka Anda akan mengkonfigurasi tugas di Gruntfile.js

copy: {
  main: {
    src: 'src/*',
    dest: 'dest/',
  },
}

Ini seperti <plugin>/<plugin> maven. 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.

4
Kevin

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

Apa itu plugin?

Plugins melakukan tugas untuk build Maven. Ini tidak dikemas dalam aplikasi. 

Ini adalah jantung Maven.
Setiap tugas yang dijalankan oleh Maven dilakukan oleh plugin .
Ada dua kategori plugin: build dan reporting plugins

  • Plugin build akan dieksekusi selama build dan harus dikonfigurasi dalam elemen <build/> dari POM.
  • Plugin pelaporan akan dieksekusi selama pembuatan situs dan harus dikonfigurasi dalam elemen <reporting/> dari POM. 

Menurut tujuan pakar yang ditentukan dalam baris perintah (misalnya mvn clean, mvn clean package atau mvn site), gaya hidup tertentu akan digunakan dan serangkaian tujuan plugin spesifik akan dieksekusi.
Ada tiga siklus hidup bawaan: default, clean dan site. Siklus hidup default menangani penyebaran proyek Anda, siklus hidup clean menangani pembersihan proyek, sedangkan siklus hidup site menangani pembuatan dokumentasi situs proyek Anda. 

Sasaran plugin mungkin terikat pada fase tertentu dari gaya hidup tertentu.
Misalnya, maven-compiler-plugin mengikat secara default tujuan compile ke fase siklus hidup: compile.
Sebagian besar plugin pakar (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 rentan 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>

Apa dependensi itu?

Ketergantungan adalah artefak/komponen Maven yang diperlukan dalam classpath selama pembangunan Maven.
Ini mungkin dikemas dalam aplikasi tetapi tidak harus (lihat scope di bawah). 

Sebagian besar dependensi adalah toples tetapi ini juga bisa berupa jenis arsip lain: perang, kuping, toples, ejb-client ... atau masih POM atau BOM.
.__ Dalam pom.xml, dependensi dapat ditentukan di banyak tempat: bagian <build><dependencies>, bagian dependencies management atau masih dalam deklarasi plugin! Memang beberapa plugin mungkin perlu memiliki beberapa dependensi di classpath selama eksekusi mereka. Itu tidak umum tetapi itu mungkin terjadi.
Berikut adalah contoh dari dokumentasi yang menunjukkan bahwa plugin dan dependency dapat bekerja bersama: 

Misalnya, Plugin Maven Antrun versi 1.2 menggunakan versi Ant 1.6.5, jika Anda ingin menggunakan versi Ant terbaru saat menjalankan plugin ini, Anda perlu menambahkan elemen <dependencies> 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 kemasan (JAR secara default) tidak umum ditentukan. Jadi format umum dalam deklarasi dependency adalah: groupId:artifactId:version.
Berikut adalah contoh ketergantungan yang dideklarasikan di bagian <build><dependencies>

<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.
Ruang lingkup default adalah compile. Itu adalah ruang lingkup yang paling umum dibutuhkan (konvensi tentang konfigurasi lagi).
Cakupan compile berarti bahwa dependensi tersedia di semua kelas jalan proyek. 

Lingkup mendefinisikan di mana classpaths ketergantungan harus ditambahkan . Misalnya apakah kita memerlukannya pada saat kompilasi dan runtime, atau hanya untuk kompilasi dan eksekusi pengujian? 

Sebagai contoh, kami sebelumnya menetapkan Hibernate sebagai dependensi compile seperti yang kami perlukan di mana-mana: kompilasi sumber, kompilasi pengujian, runtime, dan sebagainya untuk ....
Tapi kami tidak ingin bahwa perpustakaan pengujian dapat dikemas dalam aplikasi atau dirujuk dalam kode sumber. Jadi kami menentukan cakupan test untuk mereka: 

<build>
   <dependencies>
     <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
     </dependency>
   <dependencies>
</build>
4
davidxxx

Maven pada intinya adalah kerangka kerja eksekusi plugin - sesuai definisi kompak formal dan standar. Untuk membuatnya lebih jelas, perintah yang Anda gunakan seperti maven-install/clean/compile/build etc untuk membuat/mengeksekusi guci, yang kadang-kadang kami jalankan secara manual juga. Jadi, hal-hal yang ingin Anda jalankan (atau konfigurasikan atau jalankan) pada dasarnya Anda menempatkannya di tag dependensi para pakar dan jawabannya sehingga siapa yang akan menjalankan dependensi ini (diperlukan untuk pengaturan lingkungan) adalah plugin.

        javac (compiler) dependency.Java (dependency) 
1
Himanshu Ahuja