최소 자바 환경...

zini08의 이미지

안녕하세요...
개발중인 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는 안올렸습니다

이런문제는 어떻게 해야할지 막막합니다..
조언 부탁드립니다

mykldp의 이미지

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와 관련된 다른 패키지도 사용할 수 없겠지요..

leanblue의 이미지

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

옵션을 줘보세요.

Quote:

Headless Mode
For environments without a display, mouse, or keyboard
Web servers, Enterprise servers & printers
Printing, 2D, Images still enabled
Enabled in Sun's reference implementation by using a runtime flag: java -Djava.awt.headless=true
Exception thrown in headless mode
java.awt.HeadlessException
Thrown by some AWT, Swing methods when called in headless mode

LeanBlue in CyberWorld!!!

mykldp의 이미지

headless 지원은 X 가 없을때 이미지를 다룰 수 있도록 해주는것은 아닙니다.

그냥 단순히 키보드나 마우스등의 장치가 연결되어 있지 않을때(대부분의 서버에는 연결되어 있지 않죠)

이 장비들에 의존적인 API 를 호출하면 HeadlessException 이 발생하도록 해줄뿐입니다.

프로그램이 그냥 멈춰버리지 않도록 예외를 잡아서 처리할 수 있도록 해주는 거죠.

java.awt.GraphicsEnvironment 나 java.awt.HeadlessException 에 대해 참고하시면 좀 더 정보를 얻으실 수 있을겁니다.

leanblue의 이미지

원래의 질문을 잘못읽었군요.

x윈도우가 설치되지 않은 상황이라..

하지만 x의 서버가 깔린 상황이면, 이미지 프로세싱 등의 작업은 가능합니다.

단 lightweight component만을 사용해야 합니다만..

Quote:

The new AWT headless toolkit in JDK 1.4 allows developers to create instances
of
lightweight components. (ie components with a lightweight peer)
Normally to realise (request peer creation) and layout these components
they are added to a top-level container such as a Window or Frame or (in the
case of Swing components, the JFrame subclass of Frame). However each of
these top-level components cannot be created in a headless toolkit.

In a headful toolkit a developer who wishes to create but not display these
componnets could create a Frame and call Frame.pack(). Clearly this is not
an option in the headles toolkit. The remaining options for developers in
a headless toolkit are to craft code which replicates the effect of pack(),
or to call Container.addNotify(). The former option may be fragile and
difficult without knowledge of the inner workings of the toolkit, the latter
is not strictly meant to be called by developers.

Since the headless toolkit was designed to allow creation of lightweight
Component hierarchies, it is important to show how this can be done in
a reliable, supported, cross platform way.

This is needed (for example) to be able to print Components in a headless
environment.

LeanBlue in CyberWorld!!!

kwon37xi의 이미지

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> 파일을 열어보라!

zini08의 이미지

혹시나 해서 들어와 봤는데 이렇게 많은 분들이..^^
jre-1.4.1_2를 다운받아서 설치하고...
java 실행시 -Djava.awt.headless=true 옵션을 주고 실행시켜 봤습니다
좀 더 테스트를 거쳐봐야겠지만..
방금 test 해본 결과로는 jpeg이미지는 서비스 되는것같습니다
참고로 제가 만든곳에서는 직접 영상처리를 하거나 display하는것이 아니고..
다른곳(web 이나 PDA)에 서비스만 하고 있습니다

좋은 조언 감사합니다..
언제나 즐거운 하루 되시길..^^

하늘....언제나 가슴설래이게 하는 그런 존제가 되고 싶습니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.