Pertanyaan Di mana di jalan proyek maven harus saya meletakkan file-file konfigurasi yang tidak dianggap sumber daya


Saya memiliki proyek java maven yang sederhana. Salah satu kelas saya saat mengeksekusi perlu memuat file konfigurasi xml dari classpath. Saya tidak ingin mengemas file xml tersebut ketika memproduksi toples tetapi saya ingin menyertakan file xml default dalam rakitan zip di bawah subfolder conf dan saya juga ingin xml default ini tersedia dalam tes unit untuk mengujinya.

Seperti yang saya lihat, ada 2 tempat kemungkinan dari xml default ini:

  1. src/main/resources/conf/default.xml
  2. src/main/conf/default.xml

Kedua solusi menuntut tindakan pom khusus:

  • Dalam solusi 1, saya mendapatkan salinan otomatis untuk folder target selama membangun yang berarti itu tersedia dalam pengujian tetapi saya juga mendapatkannya di jar yang diproduksi yang tidak saya inginkan.

  • Dalam larutan 2, saya mendapatkan guci yang saya inginkan (bebas dari xml) tetapi saya secara manual harus menyalin xml ke folder target agar tersedia untuk pengujian. (Saya tidak ingin menambahkan subfolder src di test classpath. Saya pikir itu adalah praktik yang buruk).

Pertanyaan: apa solusi terbaik dari keduanya?
- Jika yang benar adalah 2, apa cara terbaik untuk menyalinnya ke folder target?
- Apakah ada solusi lain yang lebih baik dan lebih umum daripada keduanya?

(Saya juga membaca Di mana saya harus meletakkan file konfigurasi aplikasi untuk proyek Maven? tetapi saya ingin mengetahui "solusi paling tepat" dari sudut pandang "konvensi terhadap konfigurasi" dan tautan ini menyediakan beberapa solusi jenis konfigurasi tetapi tidak berorientasi pada konvensi apa pun. Mungkin tidak ada satu tapi saya tetap bertanya. Juga solusi yang disediakan termasuk plugin AntRun dan plugin appAssembler dan saya ingin tahu apakah saya bisa melakukannya dengan mereka.)


32
2018-06-08 22:16


asal


Jawaban:


Pertanyaannya adalah apa solusi terbaik dari keduanya? Jika yang benar adalah 2, apa cara terbaik untuk menyalinnya ke folder target? Apakah ada solusi lain yang lebih baik dan lebih umum daripada keduanya?

Karena Anda ingin file itu disalin ke target/classes folder, entah bagaimana harus dianggap sebagai sumber daya (jadi baik dimasukkan ke dalam src/main/resources atau menyatakan src/main/conf sebagai direktori sumber daya). Dan jika Anda tidak menginginkannya di botol terakhir, konfigurasikan Maven JAR Plugin untuk mengecualikannya:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
          <excludes>
            <exclude>**/conf/*</exclude>
          </excludes>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

Untuk bagian perakitan, deskriptor perakitan cukup fleksibel sehingga harus mungkin untuk mencapai apa yang Anda inginkan terlepas dari pilihannya. Saya sarankan menggunakan pengaturan termudah sekalipun.


39
2018-06-09 09:47



Anda bisa menempatkannya di src / test / conf / default.xml. Testclass Anda dapat menemukannya, tetapi tidak akan dikemas menggunakan metode standar.

Dengan perakitan tambahan Anda dapat mengemasnya dari sana. Langkah itu selalu diperlukan.

Solusi yang berbeda dapat berupa membuat modul maven yang terpisah dan menempatkannya di / src / main / resources / conf / ... .Kemudian buat tabung ini menjadi dependensi uji. Anda tidak perlu melakukan konfigurasi plugin khusus, tapi saya pikir itu berlebihan untuk satu file.


1
2018-06-08 22:26



Solusi saya adalah menggunakan dua profil: Pengembangan (default) dan Pengemasan

Default / bagian saya berisi src / main / resources dan src / main / conf. Saya menyebut ini profil Pengembangan saya, yang merupakan profil implisit.

Profil kemasan saya adalah profil eksplisit yang didefinisikan di bawah bagian. Di sana di bawah / saya hanya menyebutkan src / main / resources. Ketika saya menjalankan skrip kemasan saya (saat ini kami memiliki eksternal untuk maven sejak membangun RPM keluar dari PERANG kami), saya menjalankan 'mvn install -Drpm' untuk mengaktifkan profil Kemasan saya (rpm adalah id untuk Kemasan Profil.

Jika ini tidak cukup jelas, jangan ragu untuk mengajukan lebih banyak pertanyaan.


1
2018-06-11 23:05