Saya mencoba mencari cara untuk mengatur banyak (sekitar 50+) proyek maven2, sehingga mereka dapat menyebarkannya ke dalam repositori nexus pusat. Saat menggunakan mvn deploy
tujuan, seseorang perlu menentukan target di tag distributionManagement seperti ini:
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
Sekarang, saya tidak ingin setiap pom.xml (dari 50+ itu) mengandung blok ini berulang kali. Meskipun pertama saya adalah settings.xml
file, tetapi tampaknya tidak mungkin (dengan desain) untuk mendefinisikannya di sana. Jadi, pertanyaan pertama adalah, mengapa demikian? Jika memungkinkan, saya dapat menentukannya di settings.xml dalam distribusi maven2, yang dapat didistribusikan ke semua pengembang.
Satu-satunya solusi yang mungkin saya temukan adalah membuat proyek master-pom seluruh organisasi, yang berisi pengaturan ini, dan membuat semua pom.xml lainnya bergantung pada master-pom melalui <parent>
tag. Tapi ini terlihat agak aneh dalam build multi-modul:
- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
- Project 1 module pom (with pm as parent)
- Project 2 module pom (with pm as parent)
Biasanya saya membaca di semua dokumentasi bahwa modul pom harus menggunakan pom induk, bukan yang berbeda. Tapi setelah membaca website maven tentang Warisan v. Agregasi tertulis bahwa itu memang mungkin.
Satu masalah yang saya temukan adalah dengan pembuatan situs maven, yang tampaknya memiliki masalah dengan pengaturan ini (modul tidak terhubung dengan benar jika mereka tidak memiliki referensi balik langsung)
Jadi, apakah ini pendekatan yang valid? Adakah solusi lain yang lebih jelas dan sederhana untuk masalah ini?
Jawaban:
Solusi terbaik untuk ini adalah membuat proyek file induk pom sederhana (dengan pengemasan 'pom') secara umum untuk semua proyek dari organisasi Anda.
Ini dapat dibangun, dirilis, dan diterapkan ke nexus lokal Anda sehingga setiap orang memiliki akses ke artefaknya.
Sekarang untuk semua proyek yang ingin Anda gunakan, cukup sertakan bagian ini:
Solusi ini akan memungkinkan Anda dengan mudah menambahkan hal umum lainnya ke semua proyek perusahaan Anda. Misalnya jika Anda ingin menstandarkan penggunaan JUnit Anda ke versi tertentu, ini akan menjadi tempat yang tepat untuk itu.
Jika Anda memiliki proyek yang menggunakan struktur multi-modul yang memiliki induknya sendiri, Maven juga mendukung pewarisan rantai sehingga sangat dapat diterima untuk membuat file pom induk proyek Anda merujuk ke pom induk perusahaan Anda dan membuat modul anak proyek bahkan tidak menyadari keberadaan Anda. induk perusahaan.
Saya melihat dari contoh struktur proyek Anda bahwa Anda mencoba untuk menempatkan proyek induk Anda pada tingkat yang sama dengan pom aggregator Anda. Jika proyek Anda membutuhkan induknya sendiri, pendekatan terbaik yang saya temukan adalah menyertakan induk pada tingkat yang sama dengan modul lainnya dan memiliki file pom.xml aggregator di root tempat semua direktori modul Anda berada.
Apa yang Anda lakukan dengan struktur ini adalah menyertakan modul induk Anda di agregator dan membangun semuanya dengan a
mvn install
dari direktori root.Kami menggunakan solusi yang tepat ini di organisasi saya dan telah teruji oleh waktu dan bekerja dengan cukup baik bagi kami.
sumber
Tidak perlu POM orang tua.
Anda dapat menghilangkan bagian distributionManagement sepenuhnya di pom Anda dan menyetelnya di server build Anda atau di settings.xml.
Untuk melakukannya di server build, cukup teruskan ke
mvn
perintah:Lihat https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html untuk detail opsi mana yang dapat disetel.
Ini juga memungkinkan untuk mengatur ini di
settings.xml
.Cukup buat profil di sana yang diaktifkan dan berisi properti.
Contoh settings.xml:
Pastikan bahwa kredensial untuk "snapshots" dan "release" ada di
<servers>
bagian settings.xml AndaProperti altSnapshotDeploymentRepository dan altReleaseDeploymentRepository diperkenalkan dengan maven-deploy-plugin versi 2.8. Versi yang lebih lama akan gagal dengan pesan kesalahan
Untuk memperbaikinya, Anda dapat menerapkan versi plugin yang lebih baru:
sumber