Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

Language/JAVA 2013. 9. 17. 13:07

유닉스에서 자바 이미지 객체를 사용하려 할때 다음과 같은 에러가 발생한다.

 

Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

 

이것은 일종의 JDK의 버그이다. 원인은 자바가 BufferedImage 를 생성하고 실제로 Graphics 객체를 얻어오기 위해 getGraphics나 createGraphics 메소드를 부를때, 실제로 display하거나 mouse, keyboard 자원을 하나도 쓰지 않을 것임에도 불구하고 내부적으로 AWT Toolkit이 그것들에 대한 자원을 얻어오게 되어있었기 때문이다. 

Sun에서는 이걸 버그로 취급하며 해결 방법은 2가지가 있다. 

 

1. JRE 1.3 이하 일경우 www.x.org 에서 다운로드 받을 수 있는 Xvfb 라는 것을 사용하는 방법이다. 이것은 X-server 에뮬레이터이다.

 

참고

1.1. 가상 xwindow실행하기

1.1.1 리눅스 

리눅스의 경우 XFree86-Xvfb-4.1.0-3.i386.rpm 을 설치해야 합니다. 
XFree86-Xvfb-4.1.0-3.i386.rpm 패키지는 아래의 패키지가 최소한 설치되어 있어야 합니다. 
XFree86-4.1.0-3.i386.rpm 
Mesa-3.4.2-7.i386.rpm 
Xaw3d-1.5-10.i386.rpm 

설치과정중에 에러가 발생하면 아래 커맨드를 이용하여 의존성을 검사하면 됩니다. 
rpm -ivh --nodeps ./Mesa-3.4.2-7.i386.rpm 
rpm -ivh ./XFree86-4.1.0-3.i386.rpm 
rpm -ivh ./Xaw3d-1.5-10.i386.rpm 
rpm -ivh ./XFree86-Xvfb-4.1.0-3.i386.rpm 

Xvfb는 100dpi 및 75dpi용 폰트도 설치되어 있어야 합니다. 
폰트와 관련하여 간단하게 작업하려면 아래와 같이 하세요 
wget http://www.psoft.net/downloads/X11.tgz 
tar xfz ./X11.tgz -C /usr/X11R6/lib/ 

이제 모든 설치가 완료되면 아래 커맨드로 Xvfb를 활성화 시킵니다. 
/usr/X11R6/bin/Xvfb ':0' -screen 0 100x100x8 & 

이제 서버가 시작할 때 마다 이 기능을 활성화 시키려면 
/etc/rc.d/rc.local에 추가하면 됩니다.

 

1.2.1  Solaris :

다운로드 : X11R6_bin.tar.gz

1.2.2 설치 : 
% su - 
# mkdir /usr/X11R6 
# cp X11R6_bin.tar.gz /usr/X11R6 
# cd /usr/X11R6 
# gunzip X11R6_bin.tar.gz 
# tar xvf X11R6_bin.tar 
# rm X11R6_bin.tar


1.2.3. 자동실행 
실행 스크립트 : xvfb.server 다운로드 
자동 실행 설정 스크립트 : install.xvfb다운로드 
xvfb.server에서 RUN_AS_USER=tomcat 을 적절히 수정 후 install.xvf 만 실행하면 끄~읕

참조 : 
http://www.x.org/ 
http://developers.sun.com/solaris/articles/solaris_graphics.html#3 
http://www.idevelopment.info/data/Unix/General_UNIX/GENERAL_XvfbforSolaris.shtml 
http://chartworks.com/support/server/XvfbonUnix.html 
 

 

2. JRE 1.4 이상에서  Headless AWT Toolkit을 이용해서 이 문제를 해결한다. 파일을 실행할때 간단히 -Djava.awt.headless=true 옵션을 주는것만으로 가능하다.
 

[참고]

java 1.4 버전 이상에서는 자바 자체에서 처리 가능하게 할수 있습니다.

리눅스에서 굳이 x-window나 xvf 깔기 귀찮다고 아니면 할줄 모르시는 분들은 간단하게 이문제를 해결하는 방법이 있습니다.

<!-- 
Note: If true, the system property, java.awt.headless, will be set to true. 
This should be used with JDK 1.4+ on servers without graphics cards and 
monitors. Otherwise, the property is not set. 
--> 
<!-- <headless-server>true</headless-server> -->

/WEB-INF/flex/flex-config.xml에서 이부분의 주석을 제거 해주시면 됩니다.

<headless-server>true</headless-server>

 

그리고 자바 구동시에(톰켓이나 레진) JVM 파라메터를 적는 부분이 있을 것입니다.

레진 같은 경우 걍 뒤에 자바 파라메터 적으면 작동됩니다.

resin start -Djava.awt.headless=true

 

즉 flex-config에서 headless-server 수정하고 jsp 엔진 구동시에 파라 메터 Djava.awt.headless=true 를 넣어주면 에러없이 잘 해결된다.

 

톰캣에서 이용할때는 catalina.sh 파일에
CATALINA_OPTS=-Djava.awt.headless=true를 추가하고 재구동하면 된다.



출처 - http://blog.naver.com/PostView.nhn?blogId=galahad76&logNo=20042609592

: