Eclipse: Tham chiếu log4j.dtd trong log4j.xml


117

Tôi đã sử dụng log4j cho khá trong một giờ và tôi thường sử dụng này ở phía trên cùng của log4j.xml (có lẽ cũng giống như nhiều người khác và theo Google đây là các cách để làm điều đó):

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

Rõ ràng là điều này đang hoạt động, tuy nhiên Eclipse không cung cấp trợ giúp về ngữ cảnh nhạy cảm để viết XML và tất cả. Hơn nữa, nó luôn hiển thị cảnh báo rằng nó không tìm thấy log4j.dtd. Bây giờ tôi tò mò làm thế nào để sửa chữa điều này.

Tôi đã thử một vài thứ và những thứ này hoạt động:

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

Như bạn có thể thấy ở trên, chúng tôi đang sử dụng Maven. Do đó, tôi đã thử điều này, nhưng nó không thành công:

<!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 thường biết cách xử lý các biến classpath, nhưng tại sao điều này không hoạt động? Tôi biết rằng tham chiếu sẽ không hoạt động trong thời gian chạy, nhưng cũng không đơn giản log4j.dtd(nếu tôi không sai), vì vậy đó không phải là vấn đề.

Bất cứ ai có thể vui lòng làm sáng tỏ điều này?

Câu trả lời:


176

Tôi biết câu hỏi này đã được trả lời, nhưng tôi muốn cung cấp phương án thay thế hơi khác của mình:

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

Nó tương tự như phản hồi của @ FrVaBe , nhưng về mặt tích cực, không yêu cầu thêm bất kỳ cấu hình Eclipse nào (tức là nếu bạn đang chia sẻ dự án của mình với những người khác hoặc có một nhóm lớn, thì đó là một điều ít phải lo lắng hơn).

Tuy nhiên, mặt trái của tôi là tôi tin rằng nó có nghĩa là bạn sẽ cần kết nối Internet (ít nhất là tại một số thời điểm trong quá trình phát triển, ngay cả khi đó chỉ là một lần).


cách tiếp cận này tốt hơn so với câu trả lời được chấp nhận, vì bạn không phải xử lý vị trí thực của tệp dtd. Điều này giúp ích khi chia sẻ dự án của bạn với các nhà phát triển khác.
át chủ bài.

1
Hấp dẫn. Bây giờ tôi phải tìm dtd cho log4j 2.0 - thật khó - cấu hình tệp thuộc tính của tôi trở lại!
Martin

8
đôi khi gần đây điều này đã ngừng hoạt động. Nếu bạn truy cập trình duyệt vào logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/…, bạn sẽ thấy hiện có lỗi xml
Kip

@Kip bạn nói đúng, liên kết không hoạt động. Có bất kỳ liên kết cập nhật với bất kỳ ai ở đây?
mannedear

Tôi đã kiểm tra liên kết với curl và nó trả về một DTD hoàn chỉnh. Nếu tôi cố gắng xem nó trong trình duyệt, nó sẽ trả về lỗi. Tôi khuyên bạn nên kiểm tra nó bằng công cụ như curl.
John Yeary

41

Cố gắng thêm log4j.dtd làm Mục nhập danh mục XML URI dành riêng cho người dùng trong "Tùy chọn -> XML -> Danh mục XML". Như tôi biết, đây là nơi mà eclipse quản lý các tham chiếu đến các tệp định nghĩa / xác thực (như xsd). Nếu chúng có thể được tìm thấy ở đây, nhật thực không cần truy cập internet để truy cập chúng trên vị trí (web) gốc của chúng.

Tôi đã làm như thế này (để thử nghiệm) và nhật thực không phàn nàn:

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

Cũng có thể $ {M2_REPO} hoạt động - Tôi đã không kiểm tra điều này.

Sử dụng URL gốc trong log4j.xml của bạn sau đó

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

BIÊN TẬP

Tôi sẽ đi với giải pháp trên nhưng quay lại câu hỏi của bạn, tôi nghĩ rằng các biến đường dẫn lớp 'có thể được sử dụng trong Đường dẫn xây dựng Java' . Tại sao chúng phải hoạt động bên trong định nghĩa DOCTYPE? "Xác thực" (menu ngữ cảnh nhật thực) tệp log4j.xml và bạn sẽ nhận được cảnh báo rằng không thể giải quyết đường dẫn.

Tôi hy vọng classpath:org/apache/log4j/xml/log4j.dtdsẽ làm được thủ thuật nhưng giao thức đó cũng không được hỗ trợ (xem lỗi xác thực). Tôi sợ rằng nó sẽ không hoạt động ra khỏi hộp.

Và, như tôi đã hiểu, SYSTEM "log4j.dtd"ký hiệu không có trình giữ chỗ. Đây là một tham chiếu hợp lệ đến một tài liệu dự kiến ​​sẽ được tìm thấy bên cạnh dtd (trong trường hợp này).


Tôi hiểu những gì bạn đang nói, nhưng đây có vẻ là một tài sản tổng thể. Tuy nhiên, chúng tôi có các dự án khác nhau (một số thậm chí không phải dự án Maven) và chúng sử dụng các phiên bản khác nhau của log4j. Sẽ thật tuyệt nếu tôi có thể phần nào ràng buộc cấu hình với dự án.
sjngm

Nếu bạn nói các phiên bản khác nhau của log4j - nghĩa là các phiên bản khác nhau của log4j.dtd? Hơn bạn phải xác định một mục Catalog cho mỗi phiên bản. Tôi muốn liên kết cấu hình với dự án, tốt nhất bạn nên đặt log4j.dtd bên cạnh log4j.xml (bên trong dự án) và hơn <code> SYSTEM "log4j.dtd" </code> sẽ hoạt động (tôi mong).
FrVaBe

Xin lỗi, tôi muốn nói là phiên bản khác của log4j.jartổng thể. Tôi giả sử rằng "log4j.dtd" là một số loại giữ chỗ vì nó là một tên chung chung. - Có, sao chép log4j.dtd bên cạnh XML sẽ là một giải pháp, nhưng đây có thực sự là cách phổ biến để thực hiện không?
sjngm

1
Và xin lưu ý rằng chúng ta đang nói về một giải pháp ở đây không nhắm vào câu hỏi chính.
sjngm

Xin lỗi đã không nhận thấy rằng tham chiếu http đã hoạt động - tôi nghĩ đó là giải pháp tốt nhất - hoặc tham khảo khẩn cấp cho tuyên bố của bạn SYSTEM "log4j.dtd" là cách để làm điều đó .
FrVaBe

2

Tôi đã thêm thư mục DTD trong webcontent và sau đó tôi sao chép tệp dtd log4j vào đó. sau đó tôi đã cố gắng như dưới đây. Nó đang hoạt động

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

Đường dẫn ở đây có nghĩa là đường dẫn dự án như /projectname


1

Tôi đã thử với câu trả lời của FrVaBe nhưng không hiệu quả với tôi và tôi đã thực hiện một thay đổi nhỏ trong giá trị Khóa và nó hoạt động.

"Tùy chọn -> XML -> Danh mục XML"

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

1

@Jack Leow sử dụng một cách tiếp cận tốt với ID CÔNG KHAI. Tuy nhiên, như ông chỉ ra, nó yêu cầu kết nối mạng.

Tôi thích kết hợp hơn:

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

Điều này tham chiếu đến một JAR cục bộ và hỗ trợ khai báo DOCTYPE mà không có URL đầy đủ.

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

-1

Thông thường, Eclipse tìm kiếm log4j.dtdtrong classpath và nó không tìm thấy nó ở đó và do đó xảy ra lỗi. Chúng tôi có thể giải quyết vấn đề này bằng cách cung cấp URL cho log4j.dtdtệp như bên dưới.

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

1
Đó là một bản sao chính xác của những gì tôi đã thử trong câu hỏi của mình.
sjngm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.