Pengalaman menggunakan flatten-maven-plugin untuk menyederhanakan versi dalam proyek maven

Tentang kami


Dalam 1C, kami mengembangkan tidak hanya 1C: platform Perusahaan di C ++ dan JavaScript , tetapi juga aplikasi Java - khususnya, lingkungan pengembangan Alat Pengembangan Perusahaan berbasis Eclipse dan server yang sangat terintegrasi dengan platform messenger - Sistem Interaksi .

Entri


Paling sering, kami menggunakan pakar sebagai sistem untuk merakit aplikasi Java, dan dalam artikel singkat ini kami ingin berbicara tentang salah satu masalah yang harus kami tangani selama proses pengembangan dan pendekatan yang memungkinkan kami untuk mengatasi masalah ini.

Latar Belakang dan Alur Kerja


Karena spesifik pengembangan dalam proyek pakar kami, kami menggunakan banyak modul, dependensi dan proyek anak. Jumlah file pom dalam satu pohon bisa mencapai puluhan atau bahkan ratusan.

gambar

Tampaknya: tidak apa-apa, sekali dibuat dan dilupakan. Jika Anda perlu mengubah atau menambahkan sesuatu di semua file sekaligus, ada banyak alat praktis di editor dan IDE. Dan apa perubahan reguler paling umum ke pom.xml? Kami percaya bahwa mengubah versi proyek dan dependensi. Mungkin seseorang ingin berdebat dengan ini, tapi ini masalahnya dengan kita. Alasannya adalah bahwa, bersama dengan kernel, kami secara bersamaan mengembangkan banyak perpustakaan kami sendiri, dan untuk reproduksibilitas perakitan dan hasil pengujian yang konstan, penggunaan snapshots tampaknya tidak bagi kami merupakan pendekatan yang mudah. Untuk alasan ini, perlu untuk meningkatkan nomor versi dalam proyek-proyek di setiap majelis.

Juga, pengembang dari waktu ke waktu ada kebutuhan untuk mengumpulkan cabang perpustakaan dan memeriksa kinerjanya terhadap semua dependensi, yang semuanya harus secara manual mengubah versi.

Keputusan awal


Dengan perubahan versi yang sering dan banyak, proses dalam CI ingin disederhanakan dan otomatis. Di sini, versi-maven-plugin plugin yang nyaman dan terkenal datang untuk menyelamatkan - kita pasang dan jalankan

mvn -N versi: set -DnewVersion = 2.0.1

dan Maven akan melakukan segalanya sebagaimana mestinya: jalankan melalui hierarki dari atas ke bawah, ganti semua versi - keindahan! Sekarang tinggal menaikkan permintaan tarik, kolega akan menonton perubahan, dan Anda dapat dengan cepat bergabung dengan bagasi. Cepat? Bagaimanapun caranya. Beberapa ratusan pom.xml per ulasan, dan itu tidak termasuk kode. Selain itu, tidak ada yang aman dari gabungan konflik dengan sejumlah besar file yang dimodifikasi. Perlu dicatat di sini bahwa selama proses CI, perubahan versi terjadi secara otomatis bersamaan dengan perubahan fungsionalitas, dan tidak secara terpisah.

Fitur baru


Untuk sementara, kami tenang dan hidup dalam damai, sampai orang-orang dari Proyek Apache Maven termasuk dalam maven, mulai dengan versi 3.5.0-beta-1, dukungan untuk apa yang disebut "placeholder" versi (placeholder). Inti dari pengganti ini adalah bahwa variabel $ {revisi} , $ {sha1} dan $ {daftar perubahan} digunakan dalam pom.xml alih-alih menentukan versi proyek. Nilai dari properti ini sendiri diatur dalam elemen < properties >, atau mereka dapat didefinisikan melalui properti sistem

mvn -Drevision = 2.0.0 paket bersih

Nilai properti sistem lebih diutamakan daripada nilai yang didefinisikan dalam < properti >.

Orang tua
<project>
<modelVersion> 4.0.0 </modelVersion>
<pihak>
<groupId> org.apache </groupId>
<artifactId> apache </artifactId>
<version> 18 </version>
</parent>
<groupId> org.apache.maven.ci </groupId>
<artifactId> ci-parent </artifactId>
<name> CI Friendly Pertama </name>
<version> $ {revisi} $ {sha1} $ {daftar perubahan} </version>
...
<properti>
<revision> 1.3.1 </revision>
<changelist> -SNAPSHOT </changelist>
<sha1 />
</properties>
</project>

Keturunan
<project>
<modelVersion> 4.0.0 </modelVersion>
<pihak>
<groupId> org.apache.maven.ci </groupId>
<artifactId> ci-parent </artifactId>
<version> $ {revisi} $ {sha1} $ {daftar perubahan} </version>
</parent>
<groupId> org.apache.maven.ci </groupId>
<artifactId> ci-child </artifactId>
...
</project>


Jika Anda ingin membangun versi 2.0.0-SNAPSHOT, maka gunakan saja

mvn -Drevision = 2.0.0 paket bersih

Jika Anda ingin membuat rilis, maka nolkan SNAPSHOT

mvn -Dchangelist = paket bersih

* Contoh di atas diambil dari artikel di situs web Proyek Apache Maven

Realitas yang keras


Semuanya baik dan sehat, saatnya merasakan kepuasan, tapi tidak. Ternyata untuk menginstal dan menggunakan metode ini tidak akan berfungsi, karena $ {revisi} tidak akan digantikan oleh nilainya dalam deskripsi artefak yang diterbitkan dalam repositori dan pakar tidak akan mengerti apa itu semua.

<pihak>
<groupId> org.apache </groupId>
<artifactId> apache </artifactId>
<version> $ {revisi} </version>
</parent>


Cahaya di ujung terowongan


Kita harus mencari solusi untuk masalah ini. Situasi bisa saja diselamatkan oleh sebuah flat-maven-plugin . Plugin ini memungkinkan semua variabel dalam pom, tetapi pada saat yang sama memotong satu ton informasi lain yang diperlukan hanya selama perakitan dan tidak diperlukan ketika mengimpor artefak yang diterbitkan ke proyek lain. Juga, plugin "meluruskan" semua dependensi orangtua-anak, dan sebagai hasilnya kita mendapatkan flat pom, yang mencakup semua yang Anda butuhkan. Ketidaknyamanannya adalah dia terlalu banyak memotong "terlalu banyak", yang sama sekali tidak cocok untuk kita. Setelah mempelajari informasi tentang pengembangan plugin ini, ternyata kita bukan satu-satunya di alam semesta, dan kembali pada Agustus 2018 permintaan-tarik dibuat pada github di repositori plugin dengan keinginan untuk memungkinkannya menentukan secara mandiri bagaimana cara "merusak" pom.xml. Pengembang mendengarkan suara-suara orang yang tertimpa bencana, dan sudah pada bulan Desember, dengan merilis versi baru 1.1.0, mode resolCiFriendliesOnly yang baru muncul dalam flatten-maven-plugin, yang tidak seperti sebelumnya - ia meninggalkan pom.xml sebagaimana adanya, kecuali untuk elemen <version> dan memungkinkan $ {revisi} , $ {sha1} dan $ {daftar perubahan} .

Tambahkan plugin ke proyek

<plugins>
<plugin>
<groupId> org.codehaus.mojo </groupId>
<artifactId> flatten-maven-plugin </artifactId>
<version> 1.1.0 </version>
<konfigurasi>
<updatePomFile> true </updatePomFile>
<flattenMode> resolCiFriendliesOnly </flattenMode>
</configuration>
<Eksekusi>
<eksekusi>
<id> ratakan </id>
<phase> sumber daya proses </phase>
<tujuan>
<goal> ratakan </goal>
</goals>
</execution>
<eksekusi>
<id> flatten.clean </id>
<phase> bersih </phase>
<tujuan>
<goal> bersih </goal>
</goals>
</execution>
</eksekusi>
</plugin>
</plugins>


Selesai!

Selamat berakhir


Mulai sekarang, untuk mengubah versi seluruh proyek dan membiarkan semua dependensi mengetahuinya, kita hanya perlu mengedit elemen < revisi > hanya dalam satu pom.xml root. Bukan seratus atau dua file ini dengan perubahan yang sama yang terbang ke tinjauan, tetapi satu. Yah, tidak perlu menggunakan versi-maven-plugin .

Source: https://habr.com/ru/post/id449172/


All Articles