Ошибка переполнения стека JWS - PullRequest
1 голос
/ 13 февраля 2012

Мне нравится использовать Java Web Start, чтобы выложить демонстрацию моей Java-игры в Интернет, чтобы пользователь мог просматривать и взаимодействовать с игровыми персонажами и так далее.

Я экспортировал проект в файл jar, используя функцию запуска Jar для экспорта в Eclipse. Затем я смог запустить его с java -jar успешно. Я настроил файл test.jnlp, как показано ниже:

    <?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="/home/bili/JWSdeploytest/" href="test.jnlp">
  <information>
    <title>Demo</title>
    <vendor>binman</vendor>
    <description>Test</description>
    <offline-allowed/>
  </information>
  <resources>
    <jar href="LoadbonesFOrmat.jar" main="true"/>
    <extension name="Demo" href="test.jnlp" />
  </resources>
  <security>
    <all-permissions/>
  </security>
  <application-desc />
</jnlp>

Я попытался проверить это локально на моей машине с включенным режимом отладки, который я прочитал из другого поста здесь:

set JAVAWS_TRACE_NATIVE=1
set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket, address=8989,server=y,suspend=n"

Но когда я бегу javaws test.jnlp, я получаю StackOverflowError. Ниже выводится:

bili@bili-SFF:~/JWSdeploytest$ javaws -J test.jnlp 
Exception in thread "Demo" java.lang.StackOverflowError
    at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:362)
    at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:362)
    at java.util.LinkedHashMap$KeyIterator.<init>(LinkedHashMap.java:400)
    at java.util.LinkedHashMap$KeyIterator.<init>(LinkedHashMap.java:400)
    at java.util.LinkedHashMap.newKeyIterator(LinkedHashMap.java:413)
    at java.util.HashMap$KeySet.iterator(HashMap.java:891)
    at java.io.ExpiringCache.cleanup(ExpiringCache.java:117)
    at java.io.ExpiringCache.get(ExpiringCache.java:74)
    at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:152)
    at java.io.File.getCanonicalPath(File.java:576)
    at sun.security.provider.PolicyFile.canonPath(PolicyFile.java:1872)
    at java.io.FilePermission$1.run(FilePermission.java:203)
    at java.io.FilePermission$1.run(FilePermission.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.FilePermission.init(FilePermission.java:200)
    at java.io.FilePermission.<init>(FilePermission.java:266)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
    at net.sourceforge.jnlp.config.DeploymentConfiguration.getProperty(DeploymentConfiguration.java:269)
    at net.sourceforge.jnlp.SecurityDesc.getCustomTrustedPolicy(SecurityDesc.java:172)
    at net.sourceforge.jnlp.SecurityDesc.<init>(SecurityDesc.java:159)
    at net.sourceforge.jnlp.Parser.getSecurity(Parser.java:553)
    at net.sourceforge.jnlp.JNLPFile.parse(JNLPFile.java:594)
    at net.sourceforge.jnlp.JNLPFile.<init>(JNLPFile.java:178)
    at net.sourceforge.jnlp.JNLPFile.<init>(JNLPFile.java:211)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:351)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.initializeExtensions(JNLPClassLoader.java:370)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.<init>(JNLPClassLoader.java:174)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:295)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:351)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.initializeExtensions(JNLPClassLoader.java:370)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.<init>(JNLPClassLoader.java:174)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:295)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:351)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.initializeExtensions(JNLPClassLoader.java:370)

Три строки 295: 351: 370 повторяются еще дюжину раз. Из вывода мне кажется, что происходит ограниченный доступ. Я проверил и подтвердил, что Jar-файл, jnlp, разрешен для выполнения / чтения.

Я начинаю задумываться, нужен ли мне веб-сервер для его проверки. Однако некоторые вещи, которые вызывают у меня сомнения, так как я никогда раньше не работал с JWS:

  1. Что-то не так с файлом jar (я неправильно его экспортировал)
  2. test.jnlp настроен неправильно

Есть ли какие-нибудь указатели относительно того, как я могу решить этот бизнес JWS?

Редактировать: Я удалил элемент расширения, и он выбрасывает другое исключение:

    bili@bili-SFF:~/JWSdeploytest$ javaws test.jnlp 
net.sourceforge.jnlp.LaunchException: Fatal: Launch Error: Could not launch JNLP file.
    at net.sourceforge.jnlp.Launcher.launchApplication(Launcher.java:596)
    at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:887)
Caused by: java.lang.IllegalArgumentException: file:/home/bili/JWSdeploytest/LoadbonesFOrmat.jar is not a cacheable resource
    at net.sourceforge.jnlp.cache.CacheUtil.getCacheFile(CacheUtil.java:297)
    at net.sourceforge.jnlp.Launcher.launchApplication(Launcher.java:561)
    ... 1 more
Caused by: 
java.lang.IllegalArgumentException: file:/home/bili/JWSdeploytest/LoadbonesFOrmat.jar is not a cacheable resource
    at net.sourceforge.jnlp.cache.CacheUtil.getCacheFile(CacheUtil.java:297)
    at net.sourceforge.jnlp.Launcher.launchApplication(Launcher.java:561)
    at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:887)

Этот кажется более интуитивным, и я уверен, что на этот раз я неправильно упаковал файл Jar. Попробую еще раз позже. Вот вывод от JaNeLA:

content type application/xml does not equal expected type of application/x-java-jnlp-file
XML encoding not known, but declared as utf-8
Codebase '/home/bili/JWSdeploytest/' is a malformed URL!  Defaulting to file:/home/bili/JWSdeploytest/test.jnlp
Codebase '/home/bili/JWSdeploytest/' is a malformed URL!  Defaulting to file:/home/bili/JWSdeploytest/test.jnlp
Codebase '/home/bili/JWSdeploytest/' is a malformed URL!  Defaulting to file:/home/bili/JWSdeploytest/test.jnlp
Codebase '/home/bili/JWSdeploytest/' is a malformed URL!  Defaulting to file:/home/bili/JWSdeploytest/test.jnlp
Downloads can be optimized by specifying a resource size for 'LoadbonesFOrmat.jar'.
The resource download at LoadbonesFOrmat.jar can be optimized by removing the (default) value of download='eager'.
Lazy downloads might not work as expected for LoadbonesFOrmat.jar unless the download 'part' is specified. 

Я переместил элемент безопасности над элементом ресурса, чтобы избавиться от cvc-complex-type.2.4.a: в соответствии с файлом справки JaNeLa на веб-сайте. В консоли написано, что документ действителен, но данные могут быть неверными!

1 Ответ

2 голосов
/ 13 февраля 2012

В файле JNLP есть ряд подозрительных аспектов.Большинство особенно , что это test.jnlp, но также утверждает, что загружает расширение с тем же именем!Это может быть причиной переполнения стека.

Проверьте JNLP с помощью JaNeLA .Это также определит некоторые другие проблемы.Как автору JaNeLA, мне будет интересно узнать, будет ли он также выдавать StackOverflowError, поскольку он пытается проверить основной JNLP и любое расширение .Я подозреваю, что это войдет в бесконечный цикл (пожалуйста, сообщите).

Я предполагаю, что есть только одна банка.Если это так, удалите весь элемент extension.

Кстати - действительно ли Jar называется LoadbonesFOrmat.jar?Это очень странное использование заглавных букв, я бы назвал это LoadbonesFormat.jar или LoadBonesFormat.jar (т.е. без прописных букв O).

...