Tambahkan file properti ke classpath IntelliJ

122

Saya menjalankan program Java sederhana dari IntelliJ IDE menggunakan menu Run-> Run. Ini bekerja dengan baik. Sekarang saya ingin menambahkan logging log4j.

Saya menambahkan folder sumber daya di bawah root proyek saya. Saya menambahkan file log4j.properties di folder itu. Saya mengubah kode untuk mencatat sesuatu.

Apa cara yang tepat untuk memberi tahu IntelliJ agar menyertakan folder sumber daya di classpath sehingga file properti terlihat?

Dengan IntelliJ 8 saya bisa menebak seperti monyet mabuk dan akhirnya membuatnya bekerja. Saya punya 9 sekarang dan saya sama sekali tidak berhasil. Saya sudah mencoba selama satu jam. Bagaimana dengan opsi "Tambahkan ke classpath" di suatu tempat? / fume / vent / kata-kata kasar

Tony Ennis
sumber
Oke, situasinya sudah teratasi. Ini adalah instalasi baru IntelliJ - log4J TIDAK disertakan secara default. Dalam kode saya, saya mengimpor pencatat saham, bukan log4j. Pencatat saham mendukung metode serupa sehingga tidak jelas saya menggunakan pencatat yang salah! Tidak mengherankan mengapa saya tidak membaca file properti log4j atau pelaporan yang saya perlukan untuk mengkonfigurasi log4j. Benar-benar hebat!
Tony Ennis
Menemukan deskripsi yang baik bagi pemula untuk log4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

Jawaban:

91

Coba ini:

  • Pergi ke Struktur Proyek.
  • Pilih modul Anda.
  • Temukan folder di pohon di sebelah kanan dan pilih.
  • Klik tombol Sumber di atas pohon itu (dengan folder biru) untuk menjadikan folder itu folder sumber.
ColinD
sumber
Saya telah melakukannya sekitar 50 kali, saya melakukannya lagi. Output saya tidak berubah meskipun saya mengubah pola konversi tata letak menjadi sesuatu yang sudah jelas. Saya ingin tahu apakah log4j.properties lain ada di classpath saya.
Tony Ennis
29
Periksa pola Resource di pengaturan Compiler. Periksa apakah "? *. Properties" ada di sana. Itu ada di sana secara default, tetapi itu satu-satunya hal lain yang dapat saya pikirkan di luar kepala saya.
ColinD
3
Alternatif untuk tombol Sources - klik kanan Direktori apa pun yang Anda buat dan pilih "Mark Directory As": "Source Root"
mschr
10
Perhatikan bahwa jika Anda membuat proyek Anda dari POM Maven, sebagai ganti struktur sumber ad-hoc, solusi ini tidak akan berfungsi. Sebagai gantinya Anda perlu menambahkan direktori tersebut sebagai sumber daya ke POM. Lihat jawaban Peter Thygesen.
lreeder
Dapat juga dilakukan secara terprogram melalui PropertyConfigurator.configure ("../ conf / log4j.properties")
Jason D
47

Sebenarnya Anda memiliki minimal 2 cara untuk melakukannya, cara pertama dijelaskan oleh ColinD, Anda tinggal mengkonfigurasi folder "resources" sebagai folder Sources di IDEA. Jika Pola Sumber Daya berisi ekstensi sumber daya Anda, maka itu akan disalin ke direktori keluaran saat Anda Membuat proyek dan direktori keluaran secara otomatis menjadi jalur kelas aplikasi Anda.

Cara umum lainnya adalah dengan menambahkan folder "resources" ke classpath secara langsung. Pergi ke Struktur Proyek | Modul | Modul Anda | Dependencies , klik Add , Single-Entry Module Library , tentukan jalur ke folder "resource".

Solusi lain adalah meletakkan file log4j.properties langsung di bawah root Sumber proyek Anda (di direktori paket default). Ini sama dengan cara pertama kecuali Anda tidak perlu menambahkan root Source lain di pengaturan Module Paths , file akan disalin ke direktori output di Make.

Jika Anda ingin menguji dengan konfigurasi log4j yang berbeda, mungkin lebih mudah untuk menentukan file konfigurasi kustom langsung di konfigurasi Run / Debug , parameter VM diajukan seperti:

-Dlog4j.configuration=file:/c:/log4j.properties.

CrazyCoder
sumber
Saya telah membuat paragraf 2 dan 3 Anda tidak berhasil. Saya yakin saran tersebut berfungsi , hanya saja tidak berpengaruh - itu berperilaku seperti ada file log4j.properties lain di classpath. Tapi saya tidak bisa melihatnya di mana pun. Jika saya menghapus file properti log4j saya sama sekali, saya tidak mendapatkan "Anda harus mengkonfigurasi peringatan log4j" di konsol. Saya menggunakan IntelliJ gratis (dan versi 9.x) untuk pertama kalinya, jadi mungkin ada hubungannya dengan itu.
Tony Ennis
1
Menggunakan parameter VM -D eksplisit juga tidak berpengaruh. Pada titik ini saya hanya bisa menduga bahwa saya telah jatuh dari puncak 'pohon bodoh' dan menabrak setiap cabang di jalan ke bawah! Saya pikir saya akan merangkak di sekitar JetBrains dan bertanya-tanya ...
Tony Ennis
Bisakah Anda mengirimkan proyek sampel dengan langkah-langkah yang tepat untuk mereproduksi masalah ke [email protected]?
CrazyCoder
Saya melewati -Dlog4j.configuration = file: / c: /log4j.properties dalam argumen program. Parameter VM melakukan trik untuk saya.
Ajak6
42

Saya memiliki masalah yang sama dan itu sangat mengganggu saya !!

Saya selalu berpikir saya seharusnya melakukan sebagai jawaban 2. Itu dulu bekerja di Intellij 9 (sekarang menggunakan 10).

Namun saya menemukan bahwa dengan menambahkan baris ini ke file pom maven saya membantu:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>
Peter Thygesen
sumber
Itu adalah masalah yang saya alami, sekarang file sumber daya berhasil disalin ke folder keluaran.
artjomka
Jawaban ini benar-benar berhasil. Saya telah melakukan apa yang disarankan colinD dalam komentarnya juga. Terima kasih.
Terima kasih, ini adalah satu-satunya solusi yang berhasil bagi saya.
Minh Thiện
18

Saya menghabiskan cukup banyak waktu untuk mencari tahu bagaimana melakukan ini di Intellij 13x. Sepertinya saya tidak pernah menambahkan file properti ke artefak yang memerlukannya, yang merupakan langkah terpisah di Intellij. Penyiapan di bawah ini juga berfungsi saat Anda memiliki file properti yang dibagikan oleh beberapa modul.

  • Pergi ke pengaturan proyek Anda (CTRL + ALT + SHIFT + S)
  • Dalam daftar, pilih modul yang ingin Anda tambahi satu atau beberapa file properti.
  • Di sebelah kanan, pilih tab Dependensi.
  • Klik tanda tambah hijau dan pilih "Jars atau direktori".
  • Sekarang pilih folder yang berisi file properti. (Saya belum mencoba memasukkan file individu)
  • Intellij sekarang akan menanyakan kepada Anda apa "kategori" dari file yang dipilih. Pilih "kelas" (meskipun tidak).
  • Sekarang Anda harus menambahkan file properti ke artefak. Intellij akan memberi Anda jalan pintas yang ditunjukkan di bawah ini. Ini akan menunjukkan kesalahan di bagian merah di bagian bawah dan 'bola lampu merah' yang ketika diklik menunjukkan pilihan untuk menambahkan file ke artefak. Anda juga dapat membuka bagian 'artefak' dan menambahkan file ke artefak secara manual.

masukkan deskripsi gambar di sini

Julius
sumber
14

Menghadapi tantangan serupa menambahkan file dengan ekstensi .ini ke classpath. Menemukan jawaban ini , yaitu menambahkannya ke Preferences -> Compiler -> Resource Patterns -> [...]; *. Ini

prototipe
sumber
1
ini adalah masalah yang saya alami dengan file .conf
James
Saya pikir ada apa dengan kode saya? Terima kasih untuk solusi ini
Shoaib Chikate
5

Jika Anda pernah mengalami masalah yang sama dengan Scala dan SBT:

  • Pergi ke Struktur Proyek. Pintasannya adalah (CTRL + ALT + SHIFT + S)

  • Di daftar paling kiri, pilih Project Settings> Modules

  • Pada daftar modul di sebelah kanan itu, pilih modul dari nama proyek Anda (tanpa build) dan pilih tab sumber

  • Di tengah, perluas folder yang menjadi root dari proyek Anda untuk saya itu /home/<username>/IdeaProjects/<projectName>

  • Lihatlah bagian Content Root di sisi kanan, jalur merah adalah direktori yang belum Anda buat. Anda akan ingin meletakkan file properti di direktori Resources. Jadi saya membuat src/main/resourcesdan meletakkan log4j.properties di dalamnya. Saya yakin Anda juga dapat memodifikasi Content Root untuk meletakkannya di mana pun Anda inginkan (saya tidak melakukan ini).

  • Saya menjalankan kode saya dengan konfigurasi SBT dan menemukan file log4j.properties saya.

masukkan deskripsi gambar di sini

pengguna2361174
sumber
2

Bagi Anda yang bermigrasi dari Eclipse ke IntelliJ atau sebaliknya berikut adalah tip saat bekerja dengan file properti atau file resource lainnya.

Ini menjengkelkan (menghabiskan waktu sepanjang malam untuk mengetahuinya) tetapi kedua pekerjaan IDE sangat berbeda ketika harus mencari file resource / propertty ketika Anda ingin menjalankan secara lokal dari IDE Anda atau selama debugging. (Pengemasan ke .jar juga sangat berbeda, tetapi itu didokumentasikan dengan lebih baik.)

Misalkan Anda memiliki rujukan jalur relatif seperti ini di kode Anda:

new FileInputStream("xxxx.properties");

(yang nyaman jika Anda bekerja dengan file .properties spesifik env yang tidak ingin Anda paketkan bersama JAR Anda)

INTELLIJ

(Saya menggunakan 13.1, tetapi mungkin valid untuk lebih banyak versi)

File xxxx.properties harus berada di direktori PARENT dari ROOT proyek agar dapat diambil saat runtime seperti ini di IntelliJ. (ROOT proyek adalah tempat folder / src berada)

GERHANA

Eclipse senang ketika file xxxx.properties berada di ROOT proyek itu sendiri.

Jadi IntelliJ mengharapkan file .properties menjadi 1 level lebih tinggi dari Eclipse ketika direferensikan seperti ini !!

Ini juga memengaruhi cara Anda harus mengeksekusi kode ketika Anda memiliki baris kode yang sama ini (FileInputStream baru ("xxxx.properties");) di .jar yang diekspor. Jika Anda ingin lincah dan tidak ingin mengemas file .properties dengan jar Anda, Anda harus menjalankan jar seperti di bawah ini untuk mereferensikan file .properties dengan benar dari baris perintah:

JAR EKSPOR INTELLIJ

java -cp "/path/to_properties_file/:/path/to_jar/some.jar" com.bla.blabla.ClassContainingMainMethod

ECLIPSE EKSPOR JAR

java -jar some.jar

di mana Eclipse mengekspor jar yang dapat dieksekusi hanya akan mengharapkan file .properties yang direferensikan berada di lokasi yang sama dengan tempat file .jar berada

DataHacker
sumber
Ya, logging.properties, tidak seperti log4j2.xml atau log4j.properties, harus ditemukan di root modul IntelliJ. Juga tidak seperti Log4j, yang hanya berfungsi, saya menemukan saya masih harus menjadi juri-rig untuk menjalankan di dalam IntelliJ (Eclipse akan menjadi cerita yang sama, ini adalah kesalahan logging Java), lihat stackoverflow.com/questions/960099/… . Salah satu alternatifnya adalah memperbaiki konfigurasi run / debug dengan -Djava.util.logging.config.file =, yang menurut saya agak merepotkan karena saya lebih suka memiliki konfigurasi dalam kode atau dalam file properti yang diharapkan.
Russ Bateman
1

Mungkin ini sedikit di luar topik, mengingat pertanyaannya telah terjawab, tetapi saya mengalami masalah yang sama. Dalam kasus saya, hanya beberapa sumber daya pengujian unit yang disalin ke folder keluaran setelah kompilasi. Persistence.xml saya di folder META-INF disalin tetapi tidak ada yang lain .

Pada akhirnya saya "memecahkan" masalah dengan mengganti nama file yang bermasalah, membangun kembali proyek dan kemudian mengubah nama file kembali ke aslinya. Jangan tanya saya mengapa ini berhasil tetapi berhasil. Tebakan terbaik saya adalah, entah bagaimana, proyek IntelliJ saya sedikit tidak sinkron dengan sistem file dan operasi penggantian nama memicu semacam "penelusuran ulang sumber daya" internal.

pengguna1426162
sumber
1

Ini adalah salah satu kesalahan bodoh yang telah saya lakukan. Saya menghabiskan banyak waktu untuk mencoba men-debug masalah ini dan mencoba semua tanggapan yang diposting di atas, tetapi pada akhirnya, itu adalah salah satu dari banyak kesalahan bodoh saya.

Saya menggunakan org.apache.logging.log4j.Logger(: fml :) sedangkan saya seharusnya menggunakan org.apache.log4j.Logger. Menggunakan logger yang benar ini menyelamatkan malam saya.

rata-rata
sumber
0

Saya memiliki masalah yang sama dengan file log4j.xml untuk unit test, melakukan semua hal di atas. Tapi saya tahu itu karena saya hanya menjalankan ulang tes yang gagal .... jika saya menjalankan ulang seluruh kelas tes, file yang benar diambil. Ini di bawah Intelli-j 9.0.4

James B
sumber