【问题标题】:Java Webstart "javaws -open" flag doesn't work with multiple argumentsJava Webstart“javaws -open”标志不适用于多个参数
【发布时间】:2019-05-09 11:14:01
【问题描述】:

我正在尝试调用使用“-open”运行时选项向 webstart 应用程序发送参数的 Java Webstart。我已经引用了这个问题:Passing command line arguments to javaws (Java WebStart) executable,但这种语法似乎不适用于多个参数。不过,它似乎适用于单个参数。

当我运行“javaws URLtoMyJNLP”时,它可以正常运行应用程序,当我通过“javaws -open arg URLtoMyJNLP”发送单个参数时,它似乎也可以工作,并且 arg 会到达应用程序。当我尝试运行“javaws -open arg arg URLtoMyJNLP”时,它说提供的参数无效。我在 ProcessBuilder.command 中输入命令。

InvalidArgumentException[ Invalid arguments supplied: {hello, jnlp, launch.jnlp, 123 }]

对于上述输出,我尝试发送“javaws -open abc 123 hello launch.jnlp”

有什么想法吗?

按要求编码。由于是 PoC,所以过于简单化了。

private static void launchApp(String appName, String appPath, String... args)
{
    logger.debug("Launching application: " + appName);

    Properties props = System.getProperties();
    ArrayList<String> fullCmdString = new ArrayList<String>();

    logger.debug("http://" + System.getProperty("jnlp.serverip") + ":" + System.getProperty("jnlp.serverport") + "/FB2HMI/" + appPath);

    if (args.length > 0)
    {
        fullCmdString.add("javaws");
        fullCmdString.add("-open");
    }
    for (String arg : args)
    {
        fullCmdString.add(arg);
    }

    fullCmdString.add("http://" + System.getProperty("jnlp.serverip") + ":" + System.getProperty("jnlp.serverport") + "/FB2HMI/" + appPath);
    logger.debug("Command = " + fullCmdString);
    ProcessBuilder rmLauncher = new ProcessBuilder().command(fullCmdString.stream().toArray(String[]::new));
    Process p;
    try
    {
        p = rmLauncher.start();

        processList.add(p);
        logProcessOutput(p, logger, null, appName);
    }
    catch (Exception e)
    {
        logger.fatal("Failed to launch " + appName + ": " + e);
        System.exit(1);
    }

}

【问题讨论】:

  • 编辑您的问题并显示进行调用的 Java 代码。我怀疑您通过传递单个 "javaws -open " 字符串而不是单独的 "javaws", "-open" 字符串参数来滥用 Runtime.exec 或 ProcessBuilder。
  • @VGR 当然。我更新了它。谢谢。
  • @VGR 我更新了代码并尝试了您的建议并得到了这个异常。显然,第一项是 JNLP 文件路径,不应作为参数。 InvalidArgumentException[ 提供的参数无效:{192.168.0.50:8080/FB2HMI/SystemApp.jnlp, 192.168.0.50 }]。我将端口号和源 IP 地址作为参数传递,然后是 JNLP 文件 URL。
  • 其实看了the official documentation之后,我也不确定。它确实说它需要“参数”,所以我不确定正确的用法是什么。
  • @ryvantage 我知道。我们将在未来用 HTML5/Javascript 重新设计这个应用程序,但现在需要一个临时的 webstart 解决方案。

标签: java java-web-start java-ws


【解决方案1】:

这可能是一个丑陋的答案,但由于这个问题没有任何适当的答案,我将向您展示我的工作。将参数作为环境变量传递到 JVM。这将需要编辑源应用程序以查找环境变量作为参数的替代方案,但这是我发现即使是远程也可以解决此 webstart 问题的唯一方法。

Map<String, String> saArgs = new HashMap<String, String>();
saArgs.put("jnlp.serverip", System.getProperty("jnlp.serverip"));
saArgs.put("jnlp.serverport", System.getProperty("jnlp.serverport"));
saArgs.put("port", "8887");
saArgs.put("surfaceip", "192.168.0.50");

ProcessBuilder rmLauncher = new ProcessBuilder().command(fullCmdString.stream().toArray(String[]::new));
    Process p;

    for (Map.Entry<String, String> entry : args.entrySet())
    {
        rmLauncher.environment().put(entry.getKey(), entry.getValue());
    }

    try
    {
        p = rmLauncher.start();
     }
    catch (Exception e)
    {
        logger.fatal("Failed to launch " + appName + ": " + e);
        System.exit(1);
    }

JAR 应用程序内部:

    logger.debug("jnlp.serverip = " + env.get("jnlp.serverip"));
    logger.debug("jnlp.serverport = " + env.get("jnlp.serverport"));
    logger.debug("port = " + env.get("port"));
    logger.debug("surfaceip = " + env.get("surfaceip"))

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2018-07-19
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多