5

由于 Java 7u40 中的最后一次安全更改,因此需要对 JNLP 文件进行签名。这可以通过在JNLP-INF/APPLICATION.JNLP中添加最终的 JNLP 来完成,或者通过在签名的主 jar中的JNLP-INF/APPLICATION_TEMPLATE.JNLP中提供模板 JNLP 来完成。

第一种方法效果很好,但我们希望允许将以前未知数量的运行时参数传递给我们的应用程序。

因此,我们的 APPLICATION_TEMPLATE.JNLP 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp codebase="*">
    <information>
        <title>...</title>
        <vendor>...</vendor>
        <description>...</description>
        <offline-allowed />
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <java version="1.7+" href="http://java.sun.com/products/autodl/j2se" />
        <jar href="launcher/launcher.jar" main="true"/>
        <property name="jnlp...." value="*" />
        <property name="jnlp..." value="*" />
    </resources>
    <application-desc main-class="...">
        *
    </application-desc>
</jnlp>

问题是application-desc标记中的 * 。

可以使用多个参数标记来通配固定数量的参数(参见下面的代码),但是不可能为应用程序提供更多或更少的参数(Java Webstart 不会以空参数标记开始)。

    <application-desc main-class="...">
        <argument>*</argument>
        <argument>*</argument>
        <argument>*</argument>
    </application-desc>

是否有人可以确认这个问题和/或有解决方案将以前未定义数量的运行时参数传递给 Java 应用程序?

非常感谢!

4

1 回答 1

8

从我在阅读 JNLP 7 规范后所看到的情况来看,您想要的似乎无法完成。星号只能表示文本数据,不能表示多个 XML 元素。

在您的情况下,我将使该main方法能够自己解析单个参数,因此可以使用自定义分隔符将其视为多个值。像这样的东西:

public static void main(String[] args) {
    if (args.length == 2 && args[0].equals("--args")) {
        args = args[1].split(";;");
    }

    // Continue as normal 
}

这允许模板包含:

<application-desc main-class="com.example.app.Main">
    <argument>--args</argument>
    <argument>*</argument>
</application-desc>

您实际的 .jnlp 文件可能包含以下内容:

<application-desc main-class="com.example.app.Main">
    <argument>--args</argument>
    <argument>files.txt;;29;;true;;1384212567908</argument>
</application-desc>
于 2013-11-11T23:34:09.093 回答