Eclipse: Merujuk log4j.dtd di log4j.xml

117

Saya telah menggunakan log4j untuk beberapa waktu sekarang dan saya biasanya menggunakan ini di bagian atas log4j.xml (mungkin seperti banyak orang lain dan menurut Google ini adalah yang cara untuk melakukannya):

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

Jelas ini berfungsi, namun Eclipse tidak menyediakan bantuan sensitif konteksnya untuk menulis XML dan semuanya. Selain itu, selalu muncul peringatan bahwa ia tidak menemukan file log4j.dtd. Sekarang saya penasaran bagaimana cara memperbaikinya.

Saya mencoba beberapa hal dan pekerjaan ini:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:/path/.m2/repository/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd">
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

Seperti yang Anda lihat dari atas, kami menggunakan Maven. Karena itu, saya mencoba ini, tetapi gagal:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:${M2_REPO}/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd">

Eclipse biasanya tahu bagaimana menangani variabel classpath, tapi mengapa ini tidak berhasil? Saya tahu bahwa referensi tidak akan berfungsi selama runtime, tetapi juga tidak sederhana log4j.dtd(jika saya tidak salah), jadi itu seharusnya tidak menjadi masalah.

Adakah yang bisa menjelaskan hal ini?

sjngm
sumber

Jawaban:

176

Saya tahu pertanyaan ini telah terjawab, tetapi saya ingin memberikan alternatif saya yang sedikit berbeda:

<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

Ini mirip dengan tanggapan @ FrVaBe , tetapi sisi positifnya, tidak memerlukan konfigurasi Eclipse lebih lanjut (misalnya, jika Anda berbagi proyek dengan orang lain, atau memiliki tim besar, tidak perlu khawatir).

Sisi buruknya, saya percaya itu berarti Anda memerlukan koneksi Internet (setidaknya di beberapa titik selama pengembangan, bahkan jika itu hanya satu kali).

Jack Leow
sumber
pendekatan ini lebih baik daripada jawaban yang diterima, karena Anda tidak perlu berurusan dengan lokasi fisik dari file dtd. Ini membantu saat berbagi proyek Anda dengan pengembang lain.
ace.
1
Menarik. Sekarang saya harus menemukan dtd untuk log4j 2.0 - sakitnya - apa konfigurasi file properti saya kembali!
Martin
8
kadang baru-baru ini ini berhenti bekerja. Jika Anda membuka browser ke logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/… Anda akan melihat bahwa sekarang ada kesalahan xml
Kip
@Kip Anda benar, tautan tidak berfungsi. Punya tautan yang diperbarui dengan siapa pun di sini?
diawaki tanggal
Saya memeriksa tautan dengan curl dan itu mengembalikan DTD lengkap. Jika saya mencoba melihatnya di browser, itu mengembalikan kesalahan. Saya sarankan memeriksanya dengan alat seperti curl.
John Yeary
41

Coba tambahkan log4j.dtd sebagai Entri Katalog XML URI Khusus Pengguna di "Preferensi -> XML -> Katalog XML". Seperti yang saya tahu ini adalah tempat dimana eclipse mengelola referensi ke file definisi / validasi (seperti xsd). Jika mereka dapat ditemukan di sini, gerhana tidak memerlukan akses internet untuk mengaksesnya di lokasi (web) asalnya.

Saya melakukannya seperti ini (untuk ujian) dan gerhana tidak mengeluh:

Entry element:    URI
Location:         C:\Users\me\Desktop\log4j.dtd
URI:              file:///C:/Users/me/Desktop/log4j.dtd
Key type:         URI
Key:              http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd

Mungkin juga $ {M2_REPO} berfungsi - Saya tidak memeriksa ini.

Gunakan URL asli di log4j.xml Anda sesudahnya

<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

EDIT

Saya akan menggunakan solusi di atas tetapi untuk kembali ke pertanyaan Anda, saya pikir variabel jalur kelas 'dapat digunakan dalam Jalur Build Java' . Mengapa mereka harus bekerja di dalam definisi DOCTYPE? "Validasi" (menu konteks gerhana) file log4j.xml dan Anda akan mendapatkan peringatan bahwa jalur tidak dapat diselesaikan.

Saya berharap classpath:org/apache/log4j/xml/log4j.dtdakan melakukan trik tetapi protokol itu juga tidak mendukung (lihat kesalahan validasi). Saya khawatir itu tidak akan berhasil di luar kotak.

Dan, seperti yang saya pahami, SYSTEM "log4j.dtd"notasi bukanlah placeholder. Ini adalah referensi yang valid ke dokumen yang diharapkan dapat ditemukan di sebelah dtd (dalam kasus ini).

FrVaBe
sumber
Saya mengerti apa yang Anda katakan, tetapi ini tampaknya merupakan properti keseluruhan. Namun, kami memiliki proyek yang berbeda (beberapa bahkan bukan proyek Maven) dan mereka menggunakan versi log4j yang berbeda. Akan sangat bagus jika saya bisa mengikat konfigurasi ke proyek.
sjngm
Jika Anda mengatakan versi berbeda dari log4j - apakah yang Anda maksud adalah versi berbeda dari log4j.dtd? Kemudian Anda harus menentukan entri Katalog untuk setiap versi. Jika Anda ingin mengikat konfigurasi ke proyek, mungkin yang terbaik adalah menempatkan log4j.dtd di sebelah log4j.xml (di dalam proyek) dan daripada <code> SYSTEM "log4j.dtd" </code> harus bekerja (I berharap).
FrVaBe
Maaf, maksud saya versi yang berbeda log4j.jarsecara keseluruhan. Saya berasumsi bahwa "log4j.dtd" adalah semacam placeholder karena ini adalah nama yang umum. - Ya, menyalin log4j.dtd di sebelah XML akan menjadi solusi, tetapi apakah ini benar-benar cara yang umum untuk melakukannya?
sjngm
1
Dan harap dicatat bahwa di sini kita berbicara tentang solusi yang tidak menargetkan pertanyaan utama.
sjngm
Maaf tidak memperhatikan bahwa referensi http bekerja - saya pikir itu adalah solusi terbaik - atau mohon referensi yang diberikan untuk pernyataan Anda SYSTEM "log4j.dtd" adalah cara melakukannya .
FrVaBe
2

Saya menambahkan folder DTD di konten web dan kemudian saya menyalin file log4j dtd di dalamnya. lalu saya coba seperti di bawah ini. Bekerja

<!DOCTYPE log4j:configuration SYSTEM "<Path>/DTD/log4j.dtd">

Path artinya disini jalan proyek seperti /projectname

Dileep
sumber
1

Saya telah mencoba dengan jawaban FrVaBe tetapi tidak berhasil untuk saya dan saya melakukan sedikit perubahan pada nilai Kunci dan berhasil.

"Preferensi -> XML -> Katalog XML"

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN
Abel ANEIROS
sumber
1

@Jack Leow menggunakan pendekatan yang baik dengan ID PUBLIK. Namun, seperti yang dia tunjukkan, itu membutuhkan koneksi jaringan.

Saya lebih suka kombinasi:

Entry element:      Public
Location:           org\apache\log4j\xml\log4j.dtd in jar file C:\Development\lib\external\apache-log4j-1.2.17\log4j-1.2.17.jar
URI:                jar:file:/C:/Development/lib/external/apache-log4j-1.2.17/log4j-1.2.17.jar!/org/apache/log4j/xml/log4j.dtd
Key type:           Public ID
Key:                -//APACHE//DTD LOG4J 1.2//EN

Ini mereferensikan JAR lokal, dan mendukung deklarasi DOCTYPE tanpa URL lengkap.

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
wbdarby.dll
sumber
-1

Biasanya, Eclipse mencari log4j.dtddi classpath dan tidak menemukannya di sana dan karenanya error. Kami dapat mengatasi masalah ini dengan memberikan URL untuk log4j.dtdfile seperti di bawah ini.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
Nirbhay Rana
sumber
1
Itu adalah salinan persis dari apa yang saya coba dalam pertanyaan saya.
sjngm