3

我想知道如何将运行时参数发送到通过 JNLP 文件盯着的 JavaFX 应用程序。

JNLP 文件片段:

<jfx:javafx-desc  width="800" height="600" main-class="com.blah.Main"  name="Main" >
  <argument>blah1</argument>
  <argument>blah2</argument>
</javafx-desc>

此代码段将检索 args:

List<String> list = this.getParameters().getRaw();
  for (String s : list) {
     System.err.println("args : " + s);
}

如果应用程序启动为:

javaws http://localhost:8080/test/Main.jnlp
javaws Main.jnlp

找到并打印了参数,所以这很好。我真的希望能够在应用程序启动时修改参数。

根据 javaws 规范http://docs.oracle.com/javase/7/docs/technotes/tools/share/javaws.html 我应该能够做到:

javaws -open newblah http://localhost:8080/test/Main.jnlp
javaws -open newblah Main.jnlp

这行不通。显示的争论仍然是来自 JNLP 文件的争论。

我还尝试了“-J”选项来为 VM 提供选项:

javaws -J-Dblah=something http://localhost:8080/test/Main.jnlp
javaws -J-Dblah=something Main.jnlp

并使用以下代码检索参数:

System.getProperty("blah", "noblah");

这适用于“javaws -J-Dblah=something Main.jnlp”,但不适用于通过 URL 运行时。我猜这是安全问题。我的 JNLP 有

<security>
  <all-permissions/>
</security>

我已经使用使用此命令创建的自签名密钥对应用程序进行了签名:

keytool -genkey -keyalg RSA -alias selfsigned -keystore selfsigned.jks -storepass XXXXXXX -validity 3600 -keysize 2048

最后,我尝试发送查询参数,例如:

javaws http://localhost:8080/test/Main.jnlp?blah=something

并使用以下代码检索它们:

public static Map<String, String> parseQueryParameters() {

    Map<String, String> params = new HashMap<>();

    String url = app.getHostServices().getDocumentBase().toString();
    System.err.println("url = " + url);

    if (url.indexOf("?") > -1) {
        String parameters = url.substring(url.indexOf("?") + 1);
        StringTokenizer paramGroup = new StringTokenizer(parameters, "&");

        while (paramGroup.hasMoreTokens()) {
            try {
                StringTokenizer value = new StringTokenizer(paramGroup.nextToken(), "=");
                params.put(value.nextToken(), URLDecoder.decode(value.nextToken(), "UTF-8"));
            } catch (UnsupportedEncodingException ex) {
                System.err.println("error");
            }

        }
    }

    return params;
}

但 url 字符串的打印行仅返回:

url=http://localhost:8080/test/

我真的很想知道为什么我不能得到应该直接工作的东西。

4

0 回答 0