是否可以使用 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" 由某人 运行 浏览器提交的问题,方法是手动创建新进程并且您无法更改其代码。该解决方案将是可移植的,可以在任何平台上运行,并且不依赖于系统上安装的浏览器以及当前用户是否可以 运行 它们。
我正在使用 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" 由某人 运行 浏览器提交的问题,方法是手动创建新进程并且您无法更改其代码。该解决方案将是可移植的,可以在任何平台上运行,并且不依赖于系统上安装的浏览器以及当前用户是否可以 运行 它们。