최소 자바 환경...
안녕하세요...
개발중인 target board에 java가 필요하게 되었습니다
target board에는 최소한의 필요한 lib와 커널만 있는 상태구요..
jre를 다운받아서 설치하고
java실행시 필요한 라이브러리들을 원래의 시스템에서 복사해서 넣었습니다
현제는 25M정도 된것같은데요..^^;;
어쨌든 문제는 그냥 hello world같은 프로그램은 돌아가지만
실행시켜야하는 소스에서 다음과 같은 error가 납니다
----------
java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:125)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:140)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62)
at sun.awt.motif.MToolkit.<clinit>(MToolkit.java:72)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:140)
at java.awt.Toolkit$2.run(Toolkit.java:712)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:703)
at ImageDownloader.run(MSS.java:914)
----------
아무래도 x-window가 필요한것같습니다만...
용량이 문제가 되는 target board에서는 x-window는 안올렸습니다
이런문제는 어떻게 해야할지 막막합니다..
조언 부탁드립니다
PJA 아니면 Xvfb
Xvfb는 일단 X-window 가 설치되어 있어야 합니다. 하지만 키보드나 모니터 등등의 물리적인 장치는 연결되어 있지 않은 경우에 사용합니다.
보통 서버측 자바 프로그램에서 awt 나 swing 을 사용해야할 경우에 사용합니다.
X-window의 맨페이지를 보시면 필요한 정보를 얻으실 수 있을 겁니다.
PJA 는 그래픽과 관련된 코드에서 네이티브 코드를 호출하지 않도록 순수 자바로 만들어진 라이브러리 입니다.
따라서 X 가 설치되어 있지 않아도 돌아갑니다.
하지만 awt 나 java2d 를 사용한 기존의 코드를 사용하실 수는 없구요. PJA 가 제공하는 API 를 사용해서 필요한 부분을 다시 작성하셔야 할겁니다.
그리고 제가 알기로는 이미지나 폰트와 관련된 기능만 제공됩니다. GUI와 관련된 코드는 작성할 수 없습니다.
java2d 를 대체할 수 있다고 보시면 될것 같습니다.
아래 url 에서 정보를 얻으실 수 있을겁니다.
http://www.eteks.com/pja/en/
X 를 설치하지 않고서 awt 나 java2d 를 사용하는 것은 제가 알기로는 불가능합니다. awt 가 네이티브 코드를 호출하기 때문입니다.
그리고 awt와 관련된 다른 패키지도 사용할 수 없겠지요..
J2RE 1.4.X를 써보시기 바랍니다.headless 라는 옵션
J2RE 1.4.X를 써보시기 바랍니다.
headless 라는 옵션을 쓰시게 되면,
굳이 X를 안띄우시더라도 이미지 처리가 가능합니다.[라고 하더군요. 사용해 본 적은 없습니다 ^^]
http://java.sun.com/products/jfc/tsc/articles/javaOne2001/awt_bof2001/index.html
위의 링크는 선사에서 headless로 검색한 결과중 처음 나온 문서입니다.
2001년 JavaOne 컨퍼런스와 관련된 문서 같군요..
저 문서를 보시면 아래와 같은 문구가 있습니다.
실행시에
java -Djava.awt.headless=true
옵션을 줘보세요.
LeanBlue in CyberWorld!!!
headless 모드에 대한 오해..
headless 지원은 X 가 없을때 이미지를 다룰 수 있도록 해주는것은 아닙니다.
그냥 단순히 키보드나 마우스등의 장치가 연결되어 있지 않을때(대부분의 서버에는 연결되어 있지 않죠)
이 장비들에 의존적인 API 를 호출하면 HeadlessException 이 발생하도록 해줄뿐입니다.
프로그램이 그냥 멈춰버리지 않도록 예외를 잡아서 처리할 수 있도록 해주는 거죠.
java.awt.GraphicsEnvironment 나 java.awt.HeadlessException 에 대해 참고하시면 좀 더 정보를 얻으실 수 있을겁니다.
원래의 질문을 잘못읽었군요.x윈도우가 설치되지 않은 상황이라..
원래의 질문을 잘못읽었군요.
x윈도우가 설치되지 않은 상황이라..
하지만 x의 서버가 깔린 상황이면, 이미지 프로세싱 등의 작업은 가능합니다.
단 lightweight component만을 사용해야 합니다만..
LeanBlue in CyberWorld!!!
다음 링크를 참조하세요.
JMSN 제작자 분이 올려둔 글입니다.
원문 링크 : http://www.javastudy.co.kr/bbs/read.jsp?bbs=lecbasicbbs&id=325&page=1&searchOpt=&searchString=&sortBy=
--
참 고질적인 문제이다.
수년전부터 많은 사람들을 고되게 만들었던 이 문제..
서버사이드에서 Image를 생성하는 프로그램을 짜려고 할때,
<b>Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.</b>
이런 에러를 내면서 죽어버리는 것이다.
이것은 일종의 JDK의 버그이며 (SUN측이 말했다) BufferedImage 를 생성하고
실제로 Graphics 객체를 얻어오기 위해 getGraphics나 createGraphics 메소드를
부를때, 실제로 display하거나 mouse, keyboard 자원을 하나도 쓰지 않을 것임에도
불구하고 내부적으로 AWT Toolkit이 그것들에 대한 자원을 얻어오게 되어있었기
때문이다.
나 또한 SUN의 문서를 뒤늦게야 보고 알았으며, 아무리 SUN 문서에 있다고 해도
팁란에 적어놓지 않으면 내가 나중에 또 까먹을것이 분명하므로 적어둔다.
이것의 해결책은 2가지가 있다. www.x.org 에서 다운로드 받을 수 있는
Xvfb 라는 것을 사용하는 방법이다. 이것은 X-server 에뮬레이터이다.
이것에 대해서는 여기서 언급하지 않겠다.
SUN 문서에 의하면 <b>JRE 1.4 이상에서 '적당한' 방법</b>이 하나 생겼다.
대충 들어본 사람은 들어봤겠지만, Headless AWT Toolkit 의 등장으로 해결된다.
후후 간단하다
실행할때, <b>-Djava.awt.headless=true</b> 만 주면 된다.
이렇게 주고.. 서버 사이드에서 X 자원이 없는 상태에서 아래와 같은 코드는
성공적으로 실행된다.
BufferedImage bi = new BufferedImage( 320, 240, BufferedImage.TYPE_INT_RGB );
Graphics g = bi.createGraphics();
g.setColor( Color.white );
g.fillRect( 0, 0, 320, 240 )P;
g.setColor( Color.black );
g.drawString( "안녕 세상아", 10, 40 );
g.setColor( Color.blue );
g.fillOval ( 50, 50, 200, 100 );
g.dispose();
만약 font.properties.ko 파일을 올바르게 설정해놓았다면, 한글도 아무문제없이
잘 렌더링 된다!
한 술 더 떠보자.
이것을 PNG나 JPEG같은 Image file로 떨구어 보자.
JDK 1.4에 standard로 추가된 ImageIO framework을 사용해보겠다.
위 코드에서 계속 되는.
ImageIO.write( bi, "png", new File("hello.png") );
자 <b>hello.png</b> 파일을 열어보라!
http://kwon37xi.egloos.com
고맙습니다..^^
혹시나 해서 들어와 봤는데 이렇게 많은 분들이..^^
jre-1.4.1_2를 다운받아서 설치하고...
java 실행시 -Djava.awt.headless=true 옵션을 주고 실행시켜 봤습니다
좀 더 테스트를 거쳐봐야겠지만..
방금 test 해본 결과로는 jpeg이미지는 서비스 되는것같습니다
참고로 제가 만든곳에서는 직접 영상처리를 하거나 display하는것이 아니고..
다른곳(web 이나 PDA)에 서비스만 하고 있습니다
좋은 조언 감사합니다..
언제나 즐거운 하루 되시길..^^
하늘....언제나 가슴설래이게 하는 그런 존제가 되고 싶습니다
댓글 달기