Saya memiliki proyek multi-modul, seperti ini:
main-project/
module1/
module2/
sub-module1/
sub-module2/
sub-module3/
...
module3/
module4/
...
Saya perlu mendefinisikan sekumpulan properti (yang bergantung pada lingkungan tempat saya ingin merilis proyek saya) di Maven2. Saya tidak akan menggunakan <properties>
karena ada banyak properti ... Jadi, saya menggunakan plugin Properties Maven2 .
File properti terletak di main-project/
direktori. Bagaimana saya bisa mengatur direktori yang benar di pom.xml utama, untuk menentukan ke anak mana pun tempat menemukan file properti?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>???/env_${env}.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Jika saya set saja <file>env_${env}.properties</file>
, maka ketika Maven2 mengkompilasi modul pertama, ia tidak akan menemukan main-project/env_dev.properties
file tersebut. Jika saya mengatur <file>../env_${env}.properties</file>
, maka kesalahan akan dimunculkan di tingkat induk, atau di tingkat sub-modul ...
sumber
${maven.multiModuleProjectDirectory}
Jawaban:
Coba tetapkan properti di setiap pom untuk menemukan direktori proyek utama.
Di induk:
Pada anak-anak:
Pada cucu:
sumber
${parent.basedir}
tidak lagi mengurai menjadi apa pun di 3.0.4 ...${project.basedir}/..
tetapi itu benar-benar hanya berfungsi dalam proyek multi-modul yang berada dalam hierarki direktori yang ketat.file.separator
variabel seperti ini<main.basedir>${project.basedir}${file.separator}..</main.basedir>
Setidaknya dalam versi maven saat ini (3.6.0) dapat Anda manfaatkan
${maven.multiModuleProjectDirectory}
sumber
Gunakan direktori-maven-plugin dengan direktori-tujuan .
Tidak seperti saran lain:
Plugin ini memungkinkan Anda menyetel properti pilihan Anda ke jalur absolut dari modul proyek mana pun. Dalam kasus saya, saya mengaturnya ke modul root ... Dalam proyek saya root pom:
Sejak saat itu, $ {myproject.basedir} di setiap sub-modul pom selalu memiliki jalur modul root proyek. Dan tentu saja, Anda dapat menyetel properti ke modul apa pun, bukan hanya root ...
sumber
Saya telah menemukan solusi untuk memecahkan masalah saya: Saya mencari file properti menggunakan plugin Groovy Maven.
Karena file properti saya harus ada di direktori saat ini, di ../ atau di .. / .., saya menulis kode Groovy kecil yang memeriksa ketiga folder ini.
Berikut ini ekstrak my pom.xml:
Ini berfungsi, tetapi saya tidak terlalu menyukainya.
Jadi, jika Anda memiliki solusi yang lebih baik, jangan ragu untuk memposting!
sumber
Jadi masalah yang saya lihat adalah Anda tidak bisa mendapatkan path absolut ke direktori induk di maven.
<rant> Saya pernah mendengar hal ini dibicarakan sebagai anti-pola , tapi untuk setiap anti-pola ada kasus penggunaan yang nyata dan sah untuk itu, dan saya muak dengan maven mengatakan kepada saya bahwa saya hanya bisa mengikuti pola mereka. </ kata-kata kasar>
Jadi solusi yang saya temukan adalah dengan menggunakan antrun. Coba ini di pom.xml anak:
Jika Anda menjalankan
mvn verify
Anda akan melihat sesuatu seperti ini:Anda kemudian dapat menggunakan
${main.basedir}
di salah satu plugin lain, dll. Butuh beberapa saat bagi saya untuk memikirkannya, jadi semoga ini membantu orang lain.sumber
Alternatif lain:
di pom induk, gunakan:
Di pom anak-anak, Anda dapat merujuk variabel ini.
Peringatan utama: Ini memaksa Anda untuk selalu menjalankan perintah dari direktori induk pom utama. Kemudian jika Anda ingin menjalankan perintah (uji misalnya) hanya untuk beberapa modul tertentu, gunakan sintaks ini:
mvn test --projects
Konfigurasi yang pasti untuk membuat parameter variabel "path_to_test_data" mungkin menjadi:
sumber
Profil kecil berikut berhasil untuk saya. Saya membutuhkan konfigurasi seperti itu untuk CheckStyle, yang saya masukkan ke
config
direktori di root proyek, jadi saya dapat menjalankannya dari modul utama dan dari submodul.Ini tidak akan bekerja untuk modul bersarang, tapi saya yakin itu dapat dimodifikasi untuk itu menggunakan beberapa profil dengan yang berbeda
exists
. (Saya tidak tahu mengapa harus ada "../ .." di tag verifikasi dan hanya ".." di properti yang diganti itu sendiri, tetapi hanya berfungsi dengan cara itu.)sumber
Dalam kasus saya, ini berfungsi seperti ini:
sumber
Saya telah menemukan solusi untuk memecahkan masalah ini: gunakan $ {parent.relativePath}
sumber
Anda berada di proyek C, proyek C adalah submodul dari B dan B adalah submodul dari A. Anda mencoba untuk mencapai
src/test/config/etc
direktori modul D dari proyek C. D juga merupakan submodul dari A. Ekspresi berikut memungkinkan untuk mendapatkan jalur URI:sumber
sumber
Dalam jawaban untuk pertanyaan lain, saya menunjukkan bagaimana maven-properties-plugin dapat diperluas untuk menggunakan deskriptor properti eksternal yang ditentukan dalam dependensi Maven.
Anda dapat memperluas ide itu untuk memiliki beberapa botol deskriptor, masing-masing dengan nama lingkungan sebagai bagian dari artifactId, berisi properti $ {env}. Kemudian Anda dapat menggunakan properti untuk memilih jar dan file properti yang sesuai, misalnya:
sumber
Saya baru saja meningkatkan skrip groovy dari atas untuk menulis properti di file properti induk root:
sumber
Saya rasa jika Anda menggunakan pola ekstensi yang digunakan dalam contoh untuk plugin findbugs & multimodule Anda mungkin dapat mengatur properti global yang terkait dengan jalur absolut. Ini menggunakan atasan
contoh untuk multi modul
Pom tingkat atas memiliki proyek build-config yang tidak terkait dan app-parent untuk modul proyek multimodule. App-parent menggunakan ekstensi untuk menautkan dirinya ke proyek build-config dan mendapatkan resource darinya. Ini digunakan untuk membawa file konfigurasi umum ke modul. Ini mungkin menjadi saluran untuk properti juga. Anda dapat menulis dir teratas ke file properti yang digunakan oleh build-config. (sepertinya terlalu rumit)
Masalahnya adalah bahwa level teratas baru harus ditambahkan ke proyek multi-modul agar ini berfungsi. Saya mencoba mengesampingkan langkah dengan proyek build-config yang benar-benar tidak terkait, tetapi itu kludgy dan tampak rapuh.
sumber
Ini memperluas jawaban romaintaz, yang luar biasa karena memecahkan masalah dan juga dengan jelas menunjukkan fungsionalitas maven yang hilang. Saya mengambil versi plugin yang lebih baru, dan menambahkan kasus di mana proyek bisa lebih dari 3 level.
Saya memilih untuk tidak menggunakan properti untuk menentukan nama file. Perhatikan jika build.properties tidak ditemukan, ini akan berputar selamanya. Saya menambahkan deteksi .git dir, tetapi tidak ingin terlalu memperumit respons sehingga tidak ditampilkan di sini.
sumber
Saya perlu menyelesaikan masalah serupa untuk repositori lokal yang ditempatkan di proyek utama proyek multi-modul. Pada dasarnya jalur sebenarnya adalah
${basedir}
/ lib. Akhirnya saya menetapkan ini di sayaparent.pom
:Itu
basedir
selalu menunjukkan ke modul lokal saat ini, tidak ada cara untuk mendapatkan jalur ke proyek "master" (Maven memalukan). Beberapa submodul saya satu arah lebih dalam, beberapa dua arah lebih dalam, tetapi semuanya adalah submodul langsung dari induk yang mendefinisikan URL repo.Jadi ini tidak menyelesaikan masalah secara umum. Anda selalu dapat menggabungkannya dengan jawaban yang diterima Clay dan menentukan beberapa properti lainnya - berfungsi dengan baik dan perlu didefinisikan ulang hanya untuk kasus-kasus di mana nilai dari
parent.pom
tidak cukup baik. Atau Anda mungkin hanya mengkonfigurasi ulang plugin - yang Anda lakukan hanya di artefak POM (induk dari sub-modul lain). Nilai yang diekstrak ke dalam properti mungkin lebih baik jika Anda membutuhkannya di lebih banyak tempat, terutama jika tidak ada perubahan dalam konfigurasi plugin.Menggunakan
basedir
nilai adalah bagian penting di sini, karena URLfile://${project.parent.relativePath}/lib
tidak ingin melakukan trik (saya menghapus satu garis miring untuk membuatnya relatif). Menggunakan properti yang memberi saya jalur absolut yang baik dan kemudian menjadi relatif darinya itu perlu.Jika jalurnya bukan URL / URI, mungkin bukan masalah untuk dihilangkan
basedir
.sumber
Saya mengakses direktori di atas menggunakan $ {basedir} .. \ src \
sumber
sub-module1
, itu akan menunjuk pada direktorimodule2
, bukanmain-project
.Apakah kamu sudah mencobanya
../../env_${env}.properties
?Biasanya kami melakukan hal berikut ketika module2 berada pada level yang sama dengan sub-modul
Saya akan berpikir ../ .. akan membiarkan Anda melompat dua tingkat. Jika tidak, Anda mungkin ingin menghubungi penulis plugin dan melihat apakah ini adalah masalah yang diketahui.
sumber