Jika menggunakan maven, biasanya Anda meletakkan log4j.properties di bawah java atau sumber daya?

128

Di mana saya harus meletakkan file log4j.properties ketika menggunakan direktori Maven konvensional?

pengguna496949
sumber
6
src / test / resources - konsumen artefak Anda akan mengatur level logging yang diperlukan untuk penyebaran. Namun saya akan merekomendasikan slf4j jika Anda melakukan ini untuk pekerjaan komersial. Ini memberikan opsi untuk beralih kerangka kerja penebangan di penyebaran. slf4j.org
David Victor
2
BTW jika Anda hanya ingin bereksperimen untuk menggunakan log4j tanpa file konfigurasi properti / xml. Dari ' logging.apache.org/log4j/1.2/manual.html - Configuration' "Doa dari metode BasicConfigurator.configure menciptakan pengaturan log4j yang agak sederhana." Lihat juga: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/… maven.apache.org/plugins/maven-resources-plugin/examples/…
David Victor

Jawaban:

141

src/main/resources adalah "penempatan standar" untuk ini.

Pembaruan: Jawaban di atas pertanyaan, tetapi itu bukan solusi terbaik. Lihat jawaban lain dan komentar tentang ini ... Anda mungkin tidak akan mengirim properti logging Anda sendiri dengan jar tetapi sebaliknya menyerahkannya kepada klien (misalnya server aplikasi, lingkungan panggung, dll) untuk mengonfigurasi logging yang diinginkan. Jadi, memasukkannya ke dalam src/test/resourcesadalah solusi pilihan saya.

Catatan: Berbicara tentang meninggalkan konfigurasi log konkret kepada klien / pengguna, Anda harus mempertimbangkan untuk mengganti log4jdengan slf4jdi aplikasi Anda.

Jan Galinski
sumber
Saya tidak menemukan sumber daya diretcory dibuat. Apakah saya perlu melakukannya secara manual?
user496949
3
ya. Buat secara manual resourcesdan log4j.propertiesdi folder yang disebutkan dalam jawaban.
Nishant
@ user496949: file di bawah src/main/resourcesakan disalin per default ketarget/classes
splash
17
Kecuali Anda berniat untuk mengekspor pengaturan log4j Anda sebagai bagian dari artefak Anda - jauh lebih baik untuk menempatkannya di bawah src / test / resources
David Victor
1
@FerasOdeh untuk mengeluarkannya dari artefak yang dihasilkan (guci, perang, dll.) Dan hanya digunakan selama pengujian, "Kecuali jika Anda berniat untuk mengekspor pengaturan log4j Anda sebagai bagian dari artefak Anda".
Ali Shakiba
60

Hanya dengan memasukkannya, src/main/resourcesakan mengikatnya di dalam artefak. Misalnya jika artefak Anda adalah JAR, Anda akan memiliki log4j.propertiesfile di dalamnya, kehilangan titik awal untuk membuat logging dapat dikonfigurasi.

Saya biasanya memasukkannya ke dalam src/main/resources, dan mengaturnya untuk menjadi output ke target seperti:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}</targetPath>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Selain itu, agar log4j benar-benar melihatnya, Anda harus menambahkan direktori output ke jalur kelas. Jika artefak Anda adalah JAR yang dapat dieksekusi, Anda mungkin menggunakan plugin maven-assembly-plugin untuk membuatnya. Di dalam plugin itu, Anda bisa menambahkan folder JAR saat ini ke jalur kelas dengan menambahkan Class-Pathentri manifes seperti:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.your-package.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Sekarang file log4j.properties akan berada tepat di sebelah file JAR Anda, dapat dikonfigurasi secara independen.

Untuk menjalankan aplikasi Anda langsung dari Eclipse, tambahkan resourcesdirektori ke classpath Anda di konfigurasi run Anda: Run->Run Configurations...->Java Application->Newpilih Classpathtab, pilih Advanceddan browse ke src/resourcesdirektori Anda .

Zoltán
sumber
2
Pilihan lain adalah meletakkannya di bawah src / test / resources agar tidak dibundel.
rogerdpack
Wow. Terima kasih untuk itu. Inilah yang saya butuhkan!
blissfool
@ Zoltán, saya merasa sulit untuk menambahkan direktori keluaran ke classpath seperti yang Anda sarankan. Apakah ada cara saya bisa melakukannya secara manual, seperti masuk ke file .classpath dari proyek tertentu dan tambahkan direktori output log4j ini di sana sehingga log4j dapat melihat file .properties setelah aplikasi telah dibundel ke file .war. Juga, tag targetPath, haruskah nilainya digunakan apa adanya ${project.build.directory}atau harus diedit ke jalur aktual proyek yang hidup di drive lokal saya?
Ireti
26

Beberapa akun "penambangan data" src/main/resourcesadalah tempat yang biasa.

Hasil pada Pencarian Kode Google :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215
guyuran
sumber
4
bagaimana perbedaan jawaban ini dalam hal apa pun dari yang dijawab 20 menit yang lalu? Juga, resourcestidak resource, jika saya ingat dengan benar.
Nishant
6
@Nishant: tidak berbeda, karena ketika saya membuka kotak jawaban saya meninggalkan PC. Setelah kembali dan menjawab pertanyaan, saya melewatkan pertanyaan itu sudah dijawab. resourcehanya salah ketik.
splash
1
Saya sarankan melakukan beberapa membaca sekitar maven, plugin compiler maven, konvensi untuk tata letak proyek maven. Mungkin lihat apa yang terjadi di bawah 'target' ketika artefak Anda dibangun. Maka mungkin Anda dapat mengubah jawaban Anda.
David Victor
4
Jawaban yang benar adalah src / xxx / resources - ini bukan konvensi. Lihat: maven.apache.org/plugins/maven-resources-plugin/examples/… - di sini 'xxx' mungkin 'main' atau 'test'. Kecuali jika Anda ingin memberikan tingkat logging yang telah dikonfigurasi, umumnya lebih bijaksana untuk mengkonfigurasi logging yang diperlukan untuk pengujian - melalui 'src / test / resources' - dan memungkinkan konsumen artefak Anda untuk mengatur level logging.
David Victor
22
Hasil Google untuk "Jump off a bridge": 18.200.000. Hasil Google untuk "Jangan melompat dari jembatan": 137.000
djjeck
9

Sumber daya yang digunakan untuk menginisialisasi proyek sebaiknya dimasukkan ke folder src / main / resources . Untuk mengaktifkan pemuatan sumber daya ini selama pembangunan, seseorang dapat menambahkan entri di pom.xml dalam proyek pakar sebagai sumber daya bangunan

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> 
        </resource>
    </resources>
</build> 

File .properties lainnya juga dapat disimpan dalam folder ini yang digunakan untuk inisialisasi. Penyaringan disetel benar jika Anda ingin memiliki beberapa variabel dalam file properti folder sumber daya dan mengisinya dari profil filter file properti, yang disimpan dalam src / main / filter yang ditetapkan sebagai profil tetapi itu adalah kasus penggunaan yang berbeda sama sekali . Untuk saat ini, Anda dapat mengabaikannya.

Ini adalah plugin sumber daya pakar sumber daya hebat , ini berguna, cukup telusuri bagian lain juga.

penghancur
sumber
Jika Anda hanya menyalin dan menempelkan cuplikan maven di atas, harap perhatikan bahwa itu </resources> </build>
rdesilva
6

Saat meletakkan file sumber daya di lokasi lain bukanlah solusi terbaik yang dapat Anda gunakan:

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
<build>

Sebagai contoh ketika file sumber daya (misalnya jaxb.properties) masuk jauh ke dalam paket bersama dengan kelas Java.

Ali Shakiba
sumber
1

Jika file log4j.properties atau log4j.xml Anda tidak ditemukan di bawah src / main / resources gunakan PropertyConfigurator.configure ini ("log4j.xml");

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);
ethemsulan
sumber
0

Tambahkan kode di bawah ini dari tag sumber daya di pom.xml Anda di dalam tag build. jadi itu berarti tag sumber daya harus berada di dalam tag build di pom.xml Anda

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Challa Purushotham
sumber