我开发了一个JavaFX 2.2应用程序。我打包并签署了JAR并手工编写了JNLP(见下文)。
问题是,我无法使用Java Web Start启动应用程序;例如,双击.jnlp文件。
我遇到以下错误消息:无法找到类:xxxx.pamoja.client.RichClientApplication
使用以下命令启动应用程序没有问题:
java -jar pamoja-rich-client.jar
或双击JAR文件。
因此,我知道该应用程序的工作原理。所以我猜这个问题与Java Web Start有关。
我花了很多时间“谷歌搜索”但没有找到任何适用于我的问题的信息。
有人有想法吗?我很感激任何提示!
JAR看起来像这样:
jar
|- META-INF
| |- MANIFEST.MF
| |- PAMOJA.RSA
| |- PAMOJA.SF
|
|- com
|- javafx
| |- main
| |- Main.class
| |- NoJavaFXFallback.class
|
|- xxxxx
|- pamoja
|- client
|- RichClientApplication.class
|- main.css
|- main.fxml
|- ...
Manifest(签名前):
Manifest-Version: 1.0
JavaFX-Version: 2.2
JavaFX-Application-Class: xxxx.pamoja.client.RichClientApplication
JavaFX-Fallback-Class: com.javafx.main.NoJavaFXFallback
Main-Class: com.javafx.main.Main
JNLP:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" href="pamoja-rich-client.jnlp">
<information>
<title>Pamoja Rich Client</title>
<vendor>kKdH</vendor>
<description></description>
<icon href="icon.png"/>
</information>
<resources>
<j2se version="1.7+" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="pamoja-rich-client.jar" download="eager" main="true"/>
</resources>
<security>
<all-permissions/>
</security>
<application-desc name="Pamoja Rich Client"/>
<update check="always" policy="prompt-run"/>
</jnlp>
Java:
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)
更新
我添加了codebase属性,如下所示:
<jnlp spec="1.0+" href="pamoja-rich-client.jnlp" codebase="http://localhost:8080/">
JavaFX作为资源:
<resources os="Windows">
<jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/>
</resources>
错误消息无法找到类:xxxx.pamoja.client.RichClientApplication 消失了。但现在它抛出以下NullPointerException:
java.lang.NullPointerException
at com.javafx.main.Main.getAppArguments(Main.java:506)
at com.javafx.main.Main.main(Main.java:860)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
答案 0 :(得分:4)
您的JNLP文件无效。查看JNLP文件格式的Oracle参考:JNLP File Syntax
我可以直接发现的错误是JNLP标记中缺少codebase
属性。
答案 1 :(得分:4)
您的jnlp看起来不正确。您需要添加对JavaFX的引用 - 例如对于Windows:
<resources os="Windows">
<jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/>
</resources>
答案 2 :(得分:2)
不要手动生成jnlp,而是use the JavaFX packaging tools to automatically generate the jnlp,一旦有效,你可以根据需要手动调整jnlp。
答案 3 :(得分:0)
我解决了我的问题!有两件事是必要的:
codebase 属性。
&lt; jfx:javafx-desc&gt; 标记用于指定实现JavaFX应用程序类的类。 Java Web Start可以在没有特殊“启动器”主类的情况下直接启动JavaFX应用程序。
最终的JNLP:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" href="pamoja-rich-client.jnlp" codebase="http://localhost:8080/">
<information>
<title>Pamoja Rich Client</title>
<vendor>kKdH</vendor>
<description></description>
<icon href="icon.png"/>
</information>
<resources>
<j2se version="1.7+" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="pamoja-rich-client.jar"/>
</resources>
<security>
<all-permissions/>
</security>
<application-desc name="Pamoja Rich Client"/>
<jfx:javafx-desc main-class="xxxx.pamoja.client.RichClientApplication" name="RichClientApplication" />
<update check="always" policy="prompt-run"/>
</jnlp>
如果不将JavaFX运行时指定为资源,我不知道它是否正常工作。也许它在较旧的Java版本中失败了。