3

我开发了一个 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-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 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)

更新

我添加了代码库属性,如下所示:

<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>

错误消息Unable to find class: 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)
4

4 回答 4

4

您的 JNLP 文件无效。查看 JNLP 文件格式的 Oracle 参考:JNLP 文件语法

我可以直接发现的错误是您的 JNLP 标记中缺少codebase属性。

于 2013-09-25T11:30:04.020 回答
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>
于 2013-09-25T11:33:46.700 回答
2

不要手动生成 jnlp,而是使用 JavaFX 打包工具自动生成 jnlp,一旦成功,您可以根据需要手动调整 jnlp。

于 2013-09-25T16:00:11.837 回答
0

我解决了我的问题!有两件事是必要的:

  1. 代码库属性。

  2. < jfx:javafx-desc>标记指定实现 JavaFX 应用程序类的类。Java Web Start 可以直接启动 JavaFX 应用程序,无需特殊的“启动器”Main 类。

最终的 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 版本而失败。

于 2013-09-26T10:29:44.430 回答