Eclipse : log4j.xml에서 log4j.dtd 참조


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는 일반적으로 클래스 경로 변수를 처리하는 방법을 알고 있지만 이것이 작동하지 않는 이유는 무엇입니까? 참조가 런타임 중에 작동하지 않는다는 것을 알고 있지만 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의 응답 과 비슷 하지만 더하기는 이클립스 구성이 더 필요하지 않습니다.

하지만 단점은 인터넷 연결이 필요하다는 것입니다 (적어도 개발 중 어느 시점에서는 단 한 번이라도).


이 접근 방식은 dtd 파일의 물리적 위치를 다룰 필요가 없기 때문에 허용되는 답변보다 낫습니다. 이것은 다른 개발자와 프로젝트를 공유 할 때 도움이됩니다.
에이스.

1
흥미 롭군. 이제 log4j 2.0에 대한 dtd를 찾아야합니다. 얼마나 고통 스럽습니까? 내 속성 파일 구성이 돌아 왔습니다!
Martin

8
최근에 이것은 작동을 멈췄습니다. 브라우저에서 logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/…으로 이동 하면 이제 xml 오류가 있음을 알 수 있습니다
Kip

@Kip 당신이 맞아요, 링크가 작동하지 않습니다. 여기에 누군가와 업데이트 된 링크가 있습니까?
mannedear aug

나는 curl로 링크를 확인했고 완전한 DTD를 반환했습니다. 브라우저에서 보려고하면 오류가 반환됩니다. 컬과 같은 도구로 확인하는 것이 좋습니다.
John Yeary

41

"환경 설정-> XML-> XML 카탈로그"에서 사용자 별 URI XML 카탈로그 항목으로 log4j.dtd를 추가해보십시오. 내가 알고 있듯이 이것은 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}도 작동 할 수도 있습니다. 확인하지 않았습니다.

나중에 log4j.xml에서 기본 URL을 사용하십시오.

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

편집하다

위의 솔루션으로 갈 것이지만 질문으로 돌아가려면 클래스 경로 변수 'Java 빌드 경로에서 사용할 수 있습니다' 라고 생각 합니다. DOCTYPE 정의 내에서 작동해야하는 이유는 무엇입니까? log4j.xml 파일을 "Validate"(eclipse 컨텍스트 메뉴)하면 경로를 확인할 수 없다는 경고가 표시됩니다.

나는 classpath:org/apache/log4j/xml/log4j.dtd트릭을 원했지만 그 프로토콜도 지원하지 않습니다 (유효성 검사 오류 참조). 나는 그것이 상자에서 작동하지 않을까 두렵다.

그리고 내가 이해 SYSTEM "log4j.dtd"했듯이 표기법은 자리 표시자가 아닙니다. dtd (이 경우) 옆에서 찾을 것으로 예상되는 문서에 대한 유효한 참조입니다.


나는 당신이 말하는 것을 알지만 이것은 전체적인 재산 인 것 같습니다. 그러나 우리는 다른 프로젝트 (일부는 Maven 프로젝트도 아님)를 가지고 있으며 다른 버전의 log4j를 사용합니다. 구성을 프로젝트에 어느 정도 바인딩 할 수 있다면 좋을 것입니다.
sjngm 2008

다른 버전의 log4j를 말하는 경우-다른 버전의 log4j.dtd를 의미합니까? 각 버전에 대해 카탈로그 항목을 정의해야합니다. 구성을 프로젝트에 바인딩하고 싶습니다. log4j.dtd를 log4j.xml (프로젝트 내부) 옆에 배치하는 것이 가장 좋으며 <code> SYSTEM "log4j.dtd"</ code>가 작동해야합니다 (I 기대).
FrVaBe

죄송합니다 log4j.jar. 전체적으로 다른 버전을 의미했습니다 . 나는 "log4j.dtd"가 일반적인 이름이기 때문에 일종의 자리 표시 자라고 가정합니다. -예, XML 옆에 log4j.dtd를 복사하는 것이 해결책이 될 수 있지만 이것이 실제로 수행하는 일반적인 방법입니까?
sjngm

1
그리고 우리는 여기서 주요 질문을 대상으로하지 않는 해결책에 대해 이야기하고 있음을 유의하십시오.
sjngm

죄송합니다. http 참조가 작동했다는 사실을 알아 차리지 못했습니다. 이것이 최선의 해결책이라고 생각합니다. 또는 귀하의 진술에 대한 참조 SYSTEM "log4j.dtd" 가이를 수행하는 방법 입니다.
FrVaBe

2

webcontent에 DTD 폴더를 추가 한 다음 거기에 log4j dtd 파일을 복사했습니다. 그런 다음 나는 우는 소리처럼 시도했습니다. 작동

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

경로는 여기에서 프로젝트 경로를 의미합니다. /projectname


1

나는 FrVaBe의 대답으로 시도했지만 나를 위해 작동하지 않았고 Key 값을 약간 변경했으며 작동합니다.

"환경 설정-> 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을 참조하고 전체 URL없이 DOCTYPE 선언을 지원합니다.

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

-1

일반적으로 Eclipse는 log4j.dtd클래스 경로에서 찾지 못하므로 오류가 발생합니다. log4j.dtd다음과 같은 파일의 URL을 제공하여이 문제를 해결할 수 있습니다.

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