코린이의 기록

[Tomcat] java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' 본문

Web/Tomcat

[Tomcat] java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0'

코린이예요 2018. 8. 30. 12:16
반응형


Tomcat 구동 후 404 에러가 발생하였다. 

server.xml에서 Contextpath 설정도 잘 해줬는데, 왜 404 에러가 발생하였을까 뒤적거리다가,

Catalina.out을 자세히 보라는 어느 블로그를 보고 로그를 확인해 보았다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
524 SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
525 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationProvider': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:     Could not autowire field: private com.a.b.administrator.service.CaptchaService com.a.b.administrator.security.AuthenticationProvider.captchaService; nested exception is org.springframework.beans.factory.                 BeanCreationException: Error creating bean with name 'captchaService' defined in file [/a/web/apache-tomcat-7.0.79/webapps/aui/WEB-INF/classes/com/a/b/administrator/service/CaptchaService.class]: Instantiation of bean      failed; nested exception is java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
526     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:298)
527     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1148)
528     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
529     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
530     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
531     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
532     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
533     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
534     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:636)
535     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:934)
536     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
537     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
538     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
539     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
540     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5118)
541     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5634)
542     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
543     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
544     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
545     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
546     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
547     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
548     at java.lang.Thread.run(Thread.java:748)
549 Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.a.b.administrator.service.CaptchaService com.a.b.administrator.security.AuthenticationProvider.                   captchaService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'captchaService' defined in file [/a/web/apache-tomcat-7.0.79/webapps/aui/WEB-INF/classes/com/a/      b/administrator/service/CaptchaService.class]: Instantiation of bean failed; nested exception is java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
550     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:531)
551     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
552     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:295)
553     ... 22 more
 
cs

▲ Tomcat Catalina.out 로그


이것을 아래 Reference를 통해서 수정 및 적용하여 정상적으로 화면이 출력되는것을 확인할 수 있었다. 

로그인과 관련하여 Captcha라는 것을 사용했는데, 이와 관련하여 생긴 오류가 아닐까 싶다. 실제로 Captch관련 소스에서 java.awt.image.BufferedImage 객체를 사용한다. 

1
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'captchaService' defined in file [/a/web/apache-tomcat-7.0.79/webapps/aui/WEB-INF/classes/com/a/b/administrator/service/CaptchaService.class]: Instantiation of bean      failed; nested exception is java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
cs

일부 내용을 발췌 하면 

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


해결 방법은 의외로 간단하였다.

JRE 1.3 이하 버전일 경우 Xvfb를 사용해야하는데 여러가지 패키지를 설치해야한다. 나의경우는 1.8을 사용하고 있기 때문에 아래와 같은 방법으로 해결하였다. 

JRE 1.4 이상일 경우 그리고 나의 경우는 톰캣구동에서 발생된 에러라서 catalina.sh에 아래옵션만 추가한 후 재구동 하면 된다.

1
CATALINA_OPTS=-Djava.awt.headless=true

cs

처음에는 이 옵션을 어디에 두어야할지 몰라서 CATALINA_OPTS 아래다 추가했는데, 해당 에러가 없어지지 않았다. 

그래서 맨 윗줄에 추가하여 재구동하였더니 정상적으로 동작하였다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
107 # OS specific support.  $var _must_ be set to either true or false.
108 CATALINA_OPTS=-Djava.awt.headless=true
109 cygwin=false
110 darwin=false
111 os400=false
112 hpux=false
113 case "`uname`" in
114 CYGWIN*) cygwin=true;;
115 Darwin*) darwin=true;;
116 OS400*) os400=true;;
117 HP-UX*) hpux=true;;
118 esac
119
120 # resolve links - $0 may be a softlink
121 PRG="$0"
 
cs

▲ catalina.sh 일부



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

반응형
Comments