是否可以使用 JNLP 安装浏览器

Is it possible to get browsers installed using JNLP

我正在使用 JNLP 启动 my.jar JNLP 的示例如下:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
      codebase="https://***"
      href="my.jnlp">
   <information>
      <title>***</title>
      <offline-allowed/>
   </information>
   <resources>
   <jar href="lib/my.jar"/>
  <j2se version="1.8+"
       href="http://java.sun.com/products/autodl/j2se"/>
   </resources>
   <security>
        <all-permissions/>
   </security>
   <application-desc main-class="my.gui.***">
     <argument>-browser.cmd=firefox</argument>
   </application-desc>
</jnlp>

如你所见,我设置了一个变量 browser.cmd:

<argument>-browser.cmd=firefox</argument>

它在my.jar中用于在指定的浏览器中打开HTML内容。但不幸的是,它在某些情况下不起作用。

所以我认为可以在 JNLP 中编写函数,它将 return 系统中安装的浏览器列表 这些值将像这样使用:

browser.cmd = returned 值。

是否可以通过JNLP方式实现?

您不能向 JNLP 描述符添加任何代码。这是纯粹的宣言。

我会向您推荐几种解决方案。

如果你用它来打开特定的浏览器,最好的解决办法是使用API:

    if(Desktop.isDesktopSupported()){
        Desktop desktop = Desktop.getDesktop();
        try {
            desktop.browse(new URI(url));
        } catch (IOException | URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

出于各种原因,运行 特定浏览器将其作为外部进程被认为是一种糟糕的风格。

但是据我了解您无法更改应用程序。

第二种解决方案如下。您可以使用 JNLP 实现您自己的 "browser discoverer." 运行 这个发现器,发现浏览器,然后 运行 您的 "real" 应用程序可以通过 JNLP 或直接从您的发现器传递浏览器作为参数。

如果您能找到 "right" 浏览器,此解决方案将有效。然而,这样的任务不能使用任何跨平台方式来实现。例如,在 Windows 上,您可以检查注册表,在 Linux 上,这取决于口味等。

其他,可能是 st运行ge 但恕我直言,最佳解决方案如下。您可以使用 AOP 包装 Runtime.exec() 方法。现在传递非常特殊的、不存在的参数而不是浏览器,比方说 "my-default-browser"。您可以在方面发现此字符串并调用正则 exec() 除非命令等于此特殊值。但是,在您的特殊情况下,您可以调用 desktop.browse(new URI(url)); (请参阅我的回答的开头)。

这个解决方案听起来可能很复杂,但实际上并非如此。您可以使用执行此操作的 AspectJ 实现 5 行长方面。此解决方案将解决 "crime" 由某人 运行 浏览器提交的问题,方法是手动创建新进程并且您无法更改其代码。该解决方案将是可移植的,可以在任何平台上运行,并且不依赖于系统上安装的浏览器以及当前用户是否可以 运行 它们。