본문 바로가기
DevOps/Spring

[Spring] log4j.xml 오류 : Cannot find DTD

by breezyday 2022. 6. 10.

Spring Legacy Project를 처음 등록하고 나서 log4j.xml 파일을 열어보니 다수의 에러가 발견되었습니다. 

 

 

가만히 메시지를 살펴보니 아래와 같습니다.

 

 

Cannot find DTD 'file:///D:/workspace-spring/02_CouplingTest_Spring/src/main/resources/log4j.dtd'.
Create the DTD file or configure an XML catalog for this DTD.

 

지정한 경로에서 log4j.dtd 파일을 찾을 수 없다는 메시지입니다.

 

해결방법은 크게 2가지가 있습니다.

해당 파일을 구해서 resources 폴더에 넣어주거나, 해당 파일이 있는 경로를 찾아서 적어주면 됩니다. 

 

1. 경로 찾아서 변경하기

1.1 apache.org에서 제공하는 경로

경로는 여러 가지가 있습니다만 apache.org에서 제공하는 경로는 아래와 같습니다.

 

https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd

 

log4j.dtd 파일의 경로 위의 URI로 수정하면 됩니다.

 

수정 전

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">

수정 후

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" 
 "https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

 

 

에러가 모두 사라졌습니다.

 

1.2 로컬 Jar 파일 경로

스프링 프레임워크로 환경을 구성하고 나서 Maven Dependencies를 살펴보면 다른 jar 파일과 함께 log4j.jar 파일도 존재하는 것을 볼 수 있습니다. 이 jar 파일에서 log4j.dtd의 경로를 찾아서 적어주는 방법으로 dtd 파일의 위치를 적어줄 수 있습니다.

 

 

Maven Depedencies에서 log4j.jar 파일을 찾습니다. 이 파일을 확장하면 org.apache.log4j.xml을 찾을 수 있고 그 안을 살펴보면 log4j.dtd가 있는 것을 확인할 수 있습니다. 

 

위 경로를 찾는 방법은 log4j.jar와 log4j.dtd 파일의 Qualified Name을 연결하면 됩니다. 

각 파일에서 우측 버튼을 누르고 Copy Qualified Name을 사용해 Qualified Name을 얻을 수 있습니다. 

 

// 두 파일의 Qualified Name

log4j-1.2.15.jar
- C:\Users\mono\.m2\repository\log4j\log4j\1.2.15\log4j-1.2.15.jar

log4j.dtd 
- /org/apache/log4j/xml/log4j.dtd

 

jar 파일을 사용한 경로는 jar : file : [jar파일 Qualified Name] ! [dtd파일 Qualified Name] 의 형식입니다.

앞의 문장은 보기 편하게 하기 위해 공백을 주었지만 실제 경로는 공백은 없습니다.

 

// jar 파일을 사용한 dtd 경로
jar:file:C:\Users\mono\.m2\repository\log4j\log4j\1.2.15\log4j-1.2.15.jar!/org/apache/log4j/xml/log4j.dtd

 

수정 전

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">

수정 후

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" 
 "jar:file:C:\Users\mono\.m2\repository\log4j\log4j\1.2.15\log4j-1.2.15.jar!/org/apache/log4j/xml/log4j.dtd">

 

1.3 XML Catalog 경로 

환경 구성 파일에서 이미 설정된 XML Catalog의 경로를 이용하는 방법입니다. 

 

이클립스에서 Windows > Preferences 로 들어갑니다. 

 

 

검색에서 XML을 입력하고, XML Catalog로 찾아갑니다.

 

XML Catalog Entries에서 키워드인 LOG4를 입력하면 LOG4가 설정되어 있는 것을 볼 수 있습니다.

여기서 Key 값인 '-//LOG4J//DTD LOG4J//EN'를 입력하면 log4j.dtd를 찾아갈 수 있습니다. 

 

수정 전

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">

 

수정 후

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOG4J//DTD LOG4J//EN" "log4j.dtd">

 

2. 파일 다운로드 혹은 복사 후 Resources 폴더에 추가하기

2.1 logging.apache.org 에서 다운로드

https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/

 

Index of /log4j/1.2/apidocs/org/apache/log4j/xml/doc-files

 

logging.apache.org

 

위 경로에서 log4j.dtd 파일을 다운로드하여서...

 

 

이클립스 스프링 프로젝트 내의 'src/main/resources' 경로에 넣어주면 됩니다.

 

2.2 log4j.jar 파일에서 추출하기

 

1.2절에서와 같이 Maven Dependencies에서 log4j.dtd 파일을 찾습니다.

 

 

더블 클릭하면 log4j.dtd 파일을 열 수 있습니다. 

 

 

File > Save As 메뉴에서 'src/main/resources' 경로에 저장하면 됩니다.


다양한 방법으로 위의 문제를 해결할 수 있습니다.

 

이클립스를 사용하면서 계속 느끼게 되는 점은 프로젝트 생성 시 기본값으로 설정해주는 방법은 없을까'라는 생각이 듭니다. 찾아서 문제 해결은 가능하지만 설정을 위해 몇 번의 클릭을 더 해야 하는 것은 조금은 불편하게 다가옵니다. 

 

혹시라도 다른 방법을 알고 있는 분이 있으시면 덧글 부탁드립니다.

 

 

 

 

 

 

댓글