Eclipse: การอ้างอิง log4j.dtd ใน log4j.xml


117

ผมเคยใช้ log4j มากในขณะนี้และผมมักจะใช้นี้ที่ด้านบนของ log4j.xml ที่ (อาจจะเช่นเดียวกับคนอื่น ๆ อีกมากมายและเป็นไปตาม Google นี้เป็นวิธีที่จะทำ):

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

เห็นได้ชัดว่าสิ่งนี้ใช้งานได้อย่างไรก็ตาม Eclipse ไม่ได้ให้ความช่วยเหลือตามบริบทสำหรับการเขียน XML และทั้งหมด นอกจากนี้ยังแสดงคำเตือนเสมอว่าไม่พบไฟล์log4j.dtd . ตอนนี้ฉันอยากรู้วิธีแก้ไข

ฉันลองทำสองสามอย่างและได้ผล:

<!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">

ดังที่คุณเห็นจากด้านบนเราใช้ Maven ดังนั้นฉันจึงลองสิ่งนี้ แต่ล้มเหลว:

<!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 จะรู้วิธีจัดการกับตัวแปร classpath แต่เหตุใดจึงไม่ได้ผล ฉันรู้ว่าการอ้างอิงใช้ไม่ได้ในระหว่างรันไทม์ แต่ก็ไม่ง่ายlog4j.dtd(ถ้าฉันไม่ผิด) ก็ไม่น่าจะเป็นปัญหา

ใครช่วยให้ความกระจ่างเกี่ยวกับเรื่องนี้ได้ไหม?

คำตอบ:


176

ฉันรู้ว่าคำถามนี้ได้รับคำตอบแล้ว แต่ฉันต้องการให้ทางเลือกอื่นที่แตกต่างออกไปเล็กน้อย:

<!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">

คล้ายกับการตอบสนองของ @ FrVaBeแต่ในด้านบวกไม่จำเป็นต้องมีการกำหนดค่า Eclipse เพิ่มเติม (เช่นหากคุณแชร์โปรเจ็กต์กับผู้อื่นหรือมีทีมขนาดใหญ่ก็ไม่ต้องกังวลอีกต่อไป)

อย่างไรก็ตามข้อเสียคือฉันเชื่อว่านั่นหมายความว่าคุณจะต้องมีการเชื่อมต่ออินเทอร์เน็ต (อย่างน้อยก็ในระหว่างการพัฒนาแม้ว่าจะเป็นเพียงครั้งเดียวก็ตาม)


วิธีนี้ดีกว่าคำตอบที่ยอมรับเนื่องจากคุณไม่จำเป็นต้องจัดการกับตำแหน่งทางกายภาพของไฟล์ dtd ซึ่งจะช่วยในการแบ่งปันโครงการของคุณกับนักพัฒนาคนอื่น ๆ
เอซ

1
น่าสนใจ ตอนนี้ฉันต้องหา dtd สำหรับ log4j 2.0 - เจ็บแค่ไหน - การกำหนดค่าไฟล์คุณสมบัติของฉันกลับมา!
Martin

8
บางครั้งสิ่งนี้หยุดทำงาน หากคุณเข้าไปในเบราว์เซอร์ไปที่logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/…คุณจะเห็นว่าตอนนี้มีข้อผิดพลาด xml อยู่
Kip

@Kip คุณพูดถูกลิงค์ไม่ทำงาน มีลิงค์อัพเดทกับใครที่นี่ไหม?
mannedear

ฉันตรวจสอบลิงก์ด้วย curl และส่งคืน DTD ทั้งหมด หากฉันพยายามดูในเบราว์เซอร์มันแสดงข้อผิดพลาด ฉันขอแนะนำให้ตรวจสอบด้วยเครื่องมือเช่น curl
John Yeary

41

ลองเพิ่ม log4j.dtd เป็นรายการแค็ตตาล็อก URI XML เฉพาะผู้ใช้ใน "Preferences -> XML -> XML Catalog" อย่างที่ฉันรู้ว่านี่คือที่ที่ eclipse จัดการการอ้างอิงถึงไฟล์นิยาม / การตรวจสอบความถูกต้อง (เช่น xsd) หากสามารถพบได้ที่นี่ eclipse ไม่จำเป็นต้องเชื่อมต่ออินเทอร์เน็ตเพื่อเข้าถึงบนตำแหน่งดั้งเดิม (เว็บ)

ฉันทำแบบนี้ (เพื่อการทดสอบ) และคราสไม่บ่น:

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

อาจจะใช้งานได้ $ {M2_REPO} - ฉันไม่ได้ตรวจสอบสิ่งนี้

ใช้ URL ดั้งเดิมใน log4j.xml ของคุณหลังจากนั้น

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

แก้ไข

ฉันจะใช้วิธีแก้ปัญหาข้างต้น แต่เพื่อกลับมาที่คำถามของคุณฉันคิดว่าตัวแปรพา ธ คลาส'สามารถใช้ใน Java Build Path'ได้ เหตุใดจึงควรใช้คำจำกัดความ DOCTYPE "ตรวจสอบ" (เมนูบริบท eclipse) ไฟล์ log4j.xml และคุณจะได้รับคำเตือนว่าไม่สามารถแก้ไขเส้นทางได้

ฉันหวังว่า classpath:org/apache/log4j/xml/log4j.dtdจะทำเคล็ดลับ แต่โปรโตคอลนั้นไม่รองรับด้วย (ดูข้อผิดพลาดในการตรวจสอบความถูกต้อง) ฉันกลัวว่ามันจะไม่ได้ผลนอกกรอบ

และตามที่ฉันเข้าใจSYSTEM "log4j.dtd"สัญกรณ์ไม่ใช่ตัวยึด เป็นการอ้างอิงที่ถูกต้องไปยังเอกสารที่คาดว่าจะพบถัดจาก dtd (ในกรณีนี้)


ฉันเห็นสิ่งที่คุณกำลังพูด แต่ดูเหมือนว่าจะเป็นทรัพย์สินโดยรวม อย่างไรก็ตามเรามีโครงการที่แตกต่างกัน (บางโครงการไม่ใช่โครงการ Maven) และใช้ log4j เวอร์ชันต่างๆ จะดีมากถ้าฉันสามารถเชื่อมโยงโครงแบบกับโปรเจ็กต์ได้
sjngm

หากคุณพูดว่า log4j เวอร์ชันต่างๆ - คุณหมายถึง log4j.dtd เวอร์ชันต่างๆหรือไม่ คุณต้องกำหนดรายการแคตตาล็อกสำหรับแต่ละเวอร์ชัน ฉันต้องการเชื่อมโยงการกำหนดค่ากับโปรเจ็กต์อาจเป็นการดีที่สุดที่จะวาง log4j.dtd ถัดจาก log4j.xml (ภายในโปรเจ็กต์) และมากกว่า <code> SYSTEM "log4j.dtd" </code> ควรใช้งานได้ (I หวัง)
FrVaBe

ขออภัยฉันหมายถึงเวอร์ชันlog4j.jarทั้งหมดโดยรวม ฉันคิดว่า "log4j.dtd" เป็นตัวยึดตำแหน่งบางประเภทเนื่องจากเป็นชื่อทั่วไป - ใช่การคัดลอก log4j.dtd ถัดจาก XML จะเป็นวิธีแก้ปัญหา แต่นี่เป็นวิธีที่ใช้กันทั่วไปหรือไม่?
sjngm

1
และโปรดทราบว่าเรากำลังพูดถึงวิธีแก้ปัญหาที่นี่ซึ่งไม่ได้กำหนดเป้าหมายไปที่คำถามหลัก
sjngm

ขออภัยที่ไม่ได้แจ้งให้ทราบว่าการอ้างอิง http ทำงาน - ฉันคิดว่ามันเป็นทางออกที่ดีที่สุด - หรือ pleace ได้รับการอ้างอิงคำสั่งของคุณเป็นวิธีที่จะทำมันSYSTEM "log4j.dtd"
FrVaBe

2

ฉันเพิ่มโฟลเดอร์ DTD ใน webcontent จากนั้นฉันก็คัดลอกไฟล์ log4j dtd ในนั้น แล้วฉันก็พยายามเหมือนร้อง มันใช้งานได้

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

Path หมายถึงเส้นทางโครงการเช่นนี้ /projectname


1

ฉันได้ลองใช้คำตอบของ FrVaBe แล้ว แต่ไม่ได้ผลสำหรับฉันและฉันได้ทำการเปลี่ยนแปลงเล็กน้อยในค่าคีย์และได้ผล

"ค่ากำหนด -> XML -> แคตตาล็อก XML"

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

1

@Jack Leowใช้แนวทางที่ดีกับ PUBLIC ID อย่างไรก็ตามในขณะที่เขาชี้ให้เห็นว่าต้องมีการเชื่อมต่อเครือข่าย

ฉันชอบการผสมผสาน:

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

สิ่งนี้อ้างอิง JAR ในเครื่องและสนับสนุนการประกาศ DOCTYPE โดยไม่มี URL แบบเต็ม

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

-1

โดยปกติ Eclipse จะค้นหาlog4j.dtdใน classpath และไม่พบที่นั่นจึงเกิดข้อผิดพลาด เราสามารถแก้ไขปัญหานี้ได้โดยระบุ URL สำหรับlog4j.dtdไฟล์ดังต่อไปนี้

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

1
นั่นคือสำเนาที่ถูกต้องของสิ่งที่ฉันพยายามในคำถามของฉัน
sjngm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.