온라인과 오프라인에서 따로 노는 애플릿?

leonid의 이미지


※ 애플릿이므로 JRE가 깔려있는 분들만 해보세요.

http://blogfile.paran.com/BLOG_253895/200609/1157419012_DodgeSnowLauncher.html

를 실행 시키고 메뉴에서

help - about dodgesnow version 0.1을 눌러보세요.

아무것도 안뜹니다.

그런데 저걸 하드에 다운받아서 실행시키면 about 창이 뜹니다.

왜 그럴까요?

dormael의 이미지

브라우저에서 콘솔창 띄워 보니까 에러 납니다.
에러를 확인해 보심이..

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

leonid의 이미지

Exception occurred during event dispatching:
java.lang.ExceptionInInitializerError
        at org.jdesktop.layout.GroupLayout$ContainerAutopaddingSpring.calculateP
adding(GroupLayout.java:2518)
        at org.jdesktop.layout.GroupLayout$Group.calculateAutopadding(GroupLayou
t.java:1257)
        at org.jdesktop.layout.GroupLayout$Group.calculateAutopadding(GroupLayou
t.java:1259)
        at org.jdesktop.layout.GroupLayout$Group.calculateAutopadding(GroupLayou
t.java:1259)
        at org.jdesktop.layout.GroupLayout.resetAutopadding(GroupLayout.java:800
)
        at org.jdesktop.layout.GroupLayout.prepare(GroupLayout.java:807)
        at org.jdesktop.layout.GroupLayout.preferredLayoutSize(GroupLayout.java:
641)
        at java.awt.Container.preferredSize(Container.java:1558)
        at java.awt.Container.getPreferredSize(Container.java:1543)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1617)
        at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:8
24)
        at java.awt.Container.preferredSize(Container.java:1558)
        at java.awt.Container.getPreferredSize(Container.java:1543)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1617)
        at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:690)
        at java.awt.Container.preferredSize(Container.java:1558)
        at java.awt.Container.getPreferredSize(Container.java:1543)
        at java.awt.Window.pack(Window.java:486)
        at AboutDialog.initComponents(AboutDialog.java:65)
        at AboutDialog.<init>(AboutDialog.java:12)
        at DodgeSnowGUI.actionPerformed(DodgeSnowGUI.java:194)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:18
49)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
a:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1
000)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMen
uItemUI.java:1041)
        at java.awt.Component.processMouseEvent(Component.java:5488)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
 
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1778)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:163)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:153)
        at java.awt.Dialog$1.run(Dialog.java:517)
        at java.awt.Dialog$2.run(Dialog.java:545)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:543)
        at java.awt.Component.show(Component.java:1300)
        at java.awt.Component.setVisible(Component.java:1253)
        at DodgeSnowLauncher$1.actionPerformed(DodgeSnowLauncher.java:10)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:18
49)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
a:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:5488)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
 
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
 
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
 
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: java.lang.RuntimeException: java.security.AccessControlException: acc
ess denied (java.net.SocketPermission image.paran.com:80 connect,resolve)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLCon
nection.java:887)
        at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLCon
nection.java:1912)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:376
)
        at sun.applet.AppletClassLoader.getBytes(AppletClassLoader.java:269)
        at sun.applet.AppletClassLoader.access$100(AppletClassLoader.java:44)
        at sun.applet.AppletClassLoader$1.run(AppletClassLoader.java:158)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:155)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:119)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:164)
        at org.jdesktop.layout.LayoutStyle.<clinit>(LayoutStyle.java:63)
        ... 75 more
Caused by: java.security.AccessControlException: access denied (java.net.SocketP
ermission image.paran.com:80 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlConte
xt.java:264)
        at java.security.AccessController.checkPermission(AccessController.java:
427)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:459)
        at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
        at sun.net.www.http.HttpClient.New(HttpClient.java:287)
        at sun.net.www.http.HttpClient.New(HttpClient.java:299)
        at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLC
onnection.java:796)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConne
ction.java:748)
        at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection
.java:673)
        at sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLCon
nection.java:1706)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLCon
nection.java:1089)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:367
)
        ... 87 more
Exception occurred during event dispatching:
java.lang.NoClassDefFoundError
        at org.jdesktop.layout.GroupLayout$ContainerAutopaddingSpring.calculateP
adding(GroupLayout.java:2518)
        at org.jdesktop.layout.GroupLayout$Group.calculateAutopadding(GroupLayou
t.java:1257)
        at org.jdesktop.layout.GroupLayout$Group.calculateAutopadding(GroupLayou
t.java:1259)
        at org.jdesktop.layout.GroupLayout$Group.calculateAutopadding(GroupLayou
t.java:1259)
        at org.jdesktop.layout.GroupLayout.resetAutopadding(GroupLayout.java:800
)
        at org.jdesktop.layout.GroupLayout.layoutContainer(GroupLayout.java:676)
 
        at java.awt.Container.layout(Container.java:1401)
        at java.awt.Container.doLayout(Container.java:1390)
        at java.awt.Container.validateTree(Container.java:1473)
        at java.awt.Container.validateTree(Container.java:1480)
        at java.awt.Container.validateTree(Container.java:1480)
        at java.awt.Container.validateTree(Container.java:1480)
        at java.awt.Container.validate(Container.java:1448)
        at java.awt.Window.dispatchEventImpl(Window.java:1776)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:163)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:153)
        at java.awt.Dialog$1.run(Dialog.java:517)
        at java.awt.Dialog$2.run(Dialog.java:545)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:543)
        at java.awt.Component.show(Component.java:1300)
        at java.awt.Component.setVisible(Component.java:1253)
        at DodgeSnowLauncher$1.actionPerformed(DodgeSnowLauncher.java:10)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:18
49)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
a:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:5488)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
 
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
 
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
 
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
dormael의 이미지

에러 중간에 다른 사이트에 접속해서 이미지 가져오는 부분이 있는것 같은데 이런 거는 signed applet 같은게 필요합니다.
우선 실행이라도 되게 하시려면 메뉴에서 about 선택하면 실행되는 코드 부분과 화면 그려주는 부분에 exception 처리 같은것도 필요할 듯 하구요.

그래도 이벤트 처리 부분에서 에러는 날 수 있으므로 자원 할당(이미지나 컴포넌트 들)부분에서 문제가 생기면 기본으로 무언가 들어가게 하시던가 그런게 필요할 듯 합니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

leonid의 이미지

애초에 JAR 파일로 만들 때부터 문제가 있었던 것 같기도 합니다..

dist 폴더 안에는

lib폴더와 DodgeSnow.jar가 있고

lib폴더 안에는 swing-layout-1.0.jar가 있습니다.

이걸 하나의 jar 파일로 만들기 위해서

swing-layout-1.0.jar의 압축을 풀어서 DodgeSnow.jar 안에 합쳤습니다.

뭔가 방법이 잘못된 것 같은데,

실제로는 어떤 식으로 해야 하나요?

dormael의 이미지

기본적으로 그렇게 묶어도 문제는 없는것으로 알고 있습니다.
다만 라이브러리(swing-layout)에서 참조하는 다른 라이브러리의 클래스가 있을 경우에는 문제가 있을수도 있습니다.
둘의 실행환경의 차이점을 확실히 알고 계셔야 합니다.

그리고 이미지나 리소스는 가능하면 jar에 넣고 로드 하시는걸 추천합니다.
signed applet이 아니라면 외부 자원에 대한 억세스가 많이 제한됩니다.
외부란 jar파일, jar를 다운받은 웹서버를 제외한 부분을 말합니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

leonid의 이미지

그렇다면 라이브러리(swing-layout)에서 참조하는 다른 라이브러리의 클래스가 있을 경우를 생각해봐야겠네요.

만약 이게 문제가 될 경우 "라이브러리의 압축을 풀어서 메인 jar 파일에 합치는 방법"을 대신하는 해결책을 알고싶습니다..

이미지는 image 폴더에 넣어서 jar로 묶어뒀기 때문에

게임 재생에 필요한 이미지(사람, 눈)는 잘 로드 되는 것 같습니다.

dormael의 이미지

그런데 에러는

java.lang.RuntimeException: java.security.AccessControlException: access denied (java.net.SocketPermission image.paran.com:80 connect,resolve)

부분이 있습니다. 혹시 코드상이 아닌 GUI Builder나 다른곳에서 웹서버에 접속해서 가져오는 부분이 있는게 아닌가요?

참조 라이브러리가 또 있는 경우는 무식하게 그것들도 jar에 넣어도 되기는 합니다.
단, 경우에 따라 jar가 무식하게 커지는 상황이 발생할 수도 있습니다.
유저가 자신의 PC에 따로 설치하지 않게 하려면 이 방법이 제일 쉬울 것으로 생각합니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

netisinfinite의 이미지

그냥 archive="jar1.jar;jar2.jar" 이렇게 쓰셔도 됩니다.
굳이 하나의 jar로 만들 필요가 ...
배포용이라면 one-jar 라는 프로젝트가 있는데, 애플릿은 지원하지 않는 듯 합니다.

leonid의 이미지

JAR 파일을 약간 수정했습니다.

http://blogfile.paran.com/BLOG_253895/200609/1157507311_DodgeSnowLauncher.html

이제

java.lang.RuntimeException: java.security.AccessControlException: 
access denied (java.net.SocketPermission image.paran.com:80 connect,resolve)

이런건 안 뜨는 것 같습니다만 그래도 여전히 문제가 남아있네요..

http://blogfile.paran.com/BLOG_253895/200609/1157507311_plugin150_08.trace

이건 추적 기록입니다.

leonid의 이미지

해결했습니다.

security error는 jar 파일 안의 폴더의 배치를 수정하니 해결 되었고

javax/swing/LayoutStyle.class 문제는 JRE를 6.0으로 업데이트하니 해결 되었습니다.

http://blogfile.paran.com/BLOG_253895/200609/1157507311_DodgeSnowLauncher.html

이제 잘 작동합니다.

답변 주신 분들 모두 감사드려요 :D

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.