pom.xml dan settings.xml
pom.xml dan pengaturan.xml dapat dikatakan sebagai dua file konfigurasi paling penting di Maven, yang menentukan fungsi inti Maven. Meskipun artikel sebelumnya menyebutkan konten dalam pom.xml dan settings.xml dalam fragmen, semuanya disebutkan secara singkat, dan pembelajaran dan penelitian tidak terperinci. Tujuan artikel ini adalah untuk mempelajari dua file konfigurasi penting ini secara rinci. Kedua file konfigurasi ini dapat menyebabkan banyak topik Maven.
Koordinat Maven
Pertama, mari kita bicara tentang mengapa kita perlu menggunakan koordinat Maven.
Dunia Maven memiliki sejumlah besar komponen, yaitu, beberapa guci, perang dan file lain yang biasanya digunakan. Sebelum Maven memperkenalkan konsep koordinat untuk komponen -komponen ini, kami tidak dapat menggunakan metode apa pun untuk secara unik mengidentifikasi semua komponen ini. Karena itu, jika Anda perlu menggunakan dependensi musim semi, maka buka situs web Spring Resmi untuk mencari; Jika Anda perlu menggunakan dependensi log4J, maka buka situs web resmi Apache untuk mencari. Karena gaya yang berbeda dari setiap situs web, banyak waktu dihabiskan untuk mencari dan menjelajah halaman web. Tanpa norma dan aturan terpadu, pekerjaan tidak dapat diotomatisasi, dan tenaga kerja berulang harus diserahkan kepada mesin.
Maven mendefinisikan seperangkat aturan: komponen apa pun di dunia dapat diidentifikasi secara unik oleh koordinat Maven. Elemen koordinat Maven termasuk GroupID, Artifactid, Versi, Pengemasan, dan Klasifikasi. Sekarang selama kami memberikan koordinat elemen yang benar, Maven dapat menemukan komponen yang sesuai. Adapun tempat untuk mengunduh, Maven sendiri memiliki alamat bawaan gudang pusat "http://repo1.maven.org/maven2". Gudang pusat berisi sebagian besar komponen proyek open source populer di dunia. Mavne akan mengunduhnya saat dibutuhkan. Tentu saja, Anda juga dapat mengonfigurasi alamat gudang pusat Anda sendiri dan mengunduh komponen di gudang pusat Anda sendiri.
Misalnya, konteks musim semi:
<dependency> <GroupId> org.springframework </groupid> <ArTifactId> Spring-Context </artifactid> <version> 4.2.6.release </version> </ketergantungan
Lihatlah elemen -elemen bawahan:
Ini kira -kira konsep koordinat Maven. Memahami Koordinat Maven adalah langkah yang sangat penting dalam memahami Maven.
Ketergantungan transitif
Apa itu ketergantungan transitif? Ambil musim semi sebagai contoh. Saat menggunakan Spring, Anda akan mengandalkan perpustakaan kelas sumber terbuka lainnya. Ada dua cara untuk melakukan ini:
1. Unduh paket .zip besar yang berisi semua stoples musim semi, tetapi melakukannya sering memperkenalkan banyak ketergantungan yang tidak perlu
2. Hanya unduh paket .zip terkait Spring, tidak termasuk dependensi. Saat menggunakannya, tambahkan dependensi lain yang diperlukan sesuai dengan informasi kesalahan.
Jelas kedua pendekatan itu sangat merepotkan, dan mekanisme ketergantungan transitif Maven memecahkan masalah ini dengan baik. Buka pom.xml dari spring-core-4.1.0.release, dan saya mencegat bagian penting:
<Dependencies> <dependency> <GroupId> commons-codec </groupId> <ArTifactid> commons-codec </t Artifactid> <version> 1.9 </version> <seupop> kompilasi </scope> </opsional </opsional> </dependency> <grouptid> Commons commons commons> commons commons> commons commons> commons commons> commons commons> commons commons> commons commons> commons commons> commons commons> commons commons> <Version> 1.1.3 </version> <scope> Compile </seupop> </dependency> ... </dependencies>
Misalnya, Project A tergantung pada Spring-core, Spring-core tergantung pada commons-codec dan commons-gogging, sehingga commons-codec dan commons-gogging adalah ketergantungan transitif dari Proyek A. Maven akan menguraikan setiap POM ketergantungan langsung dan memperkenalkan ketergantungan tidak langsung yang diperlukan ke dalam proyek saat ini dalam bentuk ketergantungan transitif.
Dengan mekanisme ketergantungan transitif, di satu sisi, sangat menyederhanakan dan memfasilitasi deklarasi ketergantungan. Di sisi lain, dalam kebanyakan kasus, kita hanya perlu peduli tentang apa ketergantungan langsung dari proyek ini dan tidak perlu mempertimbangkan dependensi transitif apa yang akan diperkenalkan oleh dependensi langsung ini. Namun, kadang -kadang ketergantungan transitif juga akan memiliki beberapa masalah. Pada saat ini, kita perlu menghapus jalur dari mana ketergantungan transitif diperkenalkan. Ini disebut mediasi ketergantungan. Ada dua prinsip utama mediasi ketergantungan:
1. A-> B-> C-> X (1.0), A-> D-> X (2.0), pada saat ini, ada dua versi X pada dua jalur ketergantungan. Pada saat ini, jalur terdekat lebih disukai, jadi X (2.0) akan diuraikan dan digunakan.
2. Panjang ketergantungan a-> b-> y (1.0), a-> c-> y (2.0), y (1.0) dan y (2.0) adalah sama. Mulai dari maven2.0.9, pernyataan pertama mengikuti prioritas, yaitu, ketergantungan dengan urutan tertinggi lebih disukai.
Mengecualikan dependensi
Ketergantungan transitif secara implisit akan memperkenalkan banyak ketergantungan pada proyek, yang sangat menyederhanakan manajemen dependensi proyek, tetapi kadang -kadang fitur ini juga dapat menyebabkan masalah. Misalnya, ada situasi:
Proyek saat ini tergantung pada A. A tergantung pada versi snapshot dari perpustakaan kelas lain untuk beberapa alasan. Maka snapshot ini akan menjadi ketergantungan transitif dari proyek saat ini. Kedua, ketidakstabilan snapshot akan secara langsung mempengaruhi proyek saat ini. Pada saat ini, snapshot perlu dikecualikan dan versi rilis formal perpustakaan kelas dinyatakan dalam proyek saat ini.
Sangat sederhana untuk mengecualikan dependensi, mari kita lihat metode penulisan:
<dependency> <GroupId> com.alibaba.rocketmq </groupid> <ArTifactId> rocketmq-client </arttifactid> <version> 3.2.7 </version> <celuctions> <croupcusion> </Artifactid> </Artifactions> <Tifactions> <conconseD> Commons Lang </ArtiFacTid> </GroupidsD> <Tifactions> Commons Commons </Artifactid>
Di sini saya memperkenalkan ketergantungan RocketMQ, tetapi saya tidak ingin mengandalkan Apache-Lang di RocketMQ, tetapi ingin memperkenalkan dependensi sendirian, jadi saya mengecualikan Apache-Lang.
Perlu dicatat di sini bahwa ketika menyatakan pengecualian, hanya Groupid dan Artifactid yang diperlukan, dan elemen versi tidak diperlukan. Ini karena hanya Groupid dan Artifactid yang diperlukan untuk secara unik menemukan ketergantungan dalam grafik ketergantungan. Dengan kata lain, dalam dependensi parsed Maven, tidak mungkin untuk memiliki dua ketergantungan dengan grupid dan artefactid yang sama, tetapi versi yang berbeda.
settings.xml
settings.xml adalah konfigurasi dasar Maven. Ada banyak elemen, jadi mari kita lihat satu per satu.
1. Proxy
Proxy berarti proxy Maven. Mari kita lihat metode penulisan:
<sroxies> <drugoxy> <dent> opsional </den> <active> true </active> <protocol> http </protocol> <username> proxyuser </s untuk Username> <swasword> Proxypass </swispard> <host> proxy.host.net </host> <port> 80 </password> <nonproxyhosts> local.net | some.host.com </sproxyhosts> </drugoxy> </droxies>
Proxy diperlukan karena berkali -kali perusahaan Anda mengharuskan Anda untuk mengakses internet menggunakan proxy bersertifikat keamanan berdasarkan pertimbangan keamanan. Dalam hal ini, Anda perlu mengonfigurasi proxy HTTP untuk Maven untuk mengizinkannya mengakses repositori eksternal secara normal untuk mengunduh sumber daya yang diperlukan. Beberapa elemen proxy dapat dikonfigurasi di bawah proxy. Jika beberapa elemen proxy dinyatakan, proxy pertama yang diaktifkan akan berlaku secara default. Aktif benar untuk mengaktifkan proxy, protokol mewakili protokol proxy yang digunakan, tentu saja, hal yang paling penting adalah menentukan nama host yang benar (host) dan port (port). Jika server proxy membutuhkan otentikasi, konfigurasikan nama pengguna dan kata sandi. Elemen nonproxyhost menunjukkan nama host mana yang tidak memerlukan proxy. Anda dapat menggunakan "|" Untuk memisahkan beberapa nama host, dan juga mendukung wildcard "*".
2. Repositori
Repositori mewakili gudang pusat Maven, karena meskipun komponen di gudang jarak jauh default sangat besar, akan selalu ada saat -saat ketika mereka tidak memenuhi kebutuhan kita, dan kemudian gudang pusat lainnya akan digunakan. Mari kita lihat metode penulisan:
<repository> <id>public</id> <name>local private nexus</name> <url>http://192.168.1.6:8081/nexus/content/groups/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </potsitory>
Beberapa repositori dapat dinyatakan. ID harus unik. Berikan perhatian khusus bahwa ID yang digunakan oleh repositori pusat yang disertai Maven adalah pusat. Jika deklarasi repositori lainnya juga menggunakan ID ini, konfigurasi repositori pusat akan ditimpa. Rilis dan snapshot lebih penting. Yang pertama berarti membuka dukungan unduhan versi rilis untuk repositori, dan yang terakhir berarti menutup dukungan unduhan versi snapshot untuk repositori. Dengan cara ini, Maven akan pergi ke repositori untuk mengunduh versi rilis repositori tanpa mengunduh versi snapshot dari repositori.
3. Server
Sebagian besar gudang terpencil dapat diakses tanpa otentikasi, tetapi kadang -kadang dipertimbangkan dalam faktor keamanan dan perlu memberikan informasi otentikasi untuk mengakses beberapa gudang jarak jauh. Untuk pertimbangan keamanan, informasi otentikasi umumnya hanya ditempatkan di settings.xml, dan server adalah elemen otentikasi. Lihatlah konfigurasi:
<server> <d> Nexus-releases </dent> <userName> Penyebaran </Senername> <swasword> Deployment </sword> </ver server>
Kuncinya di sini adalah ID. ID ini harus persis sama dengan ID dari elemen repositiry yang perlu diautentikasi. Dengan kata lain, ID formal menghubungkan informasi otentikasi dan konfigurasi repositori.
4. Cermin
If warehouse X can provide all the content stored in warehouse Y, then warehouse X can be considered as a mirror of warehouse Y. In other words, any component that can be obtained from Y can be obtained from X. For example, "http://maven.net.cn/content/groups/public/" is a central warehouse "http://repo1.maven.org/maven2/" di Cina. Karena faktor lokasi geografis, cermin sering dapat memberikan layanan yang lebih cepat daripada gudang pusat, itulah sebabnya cermin digunakan.
Lihatlah konfigurasi cermin:
<mirror> <id> nexus </dent> <name> Repositori nexus internal </name> <rerl> http://192.168.1.6:8081/nexus/content/groups/public </rrorrorof>*</mirrorof> </mirror>
Dalam contoh ini, mirrorf adalah *, menunjukkan bahwa konfigurasi adalah cermin untuk semua repositori pusat, dan setiap permintaan untuk repositori pusat akan ditransfer ke cermin. Tiga elemen ID, nama, dan URL lainnya tidak berbeda dari konfigurasi gudang umum, mewakili pengidentifikasi unik, nama dan alamat gudang cermin. Demikian pula, jika gambar memerlukan otentikasi, otentikasi repositori juga dapat dikonfigurasi berdasarkan ID.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!