2016-08-18 86 views
1

我使用的JNLP启动my.jar JNLP的例子安装的浏览器是波纹管:是否有可能得到使用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这将返回安装在系统浏览器列表,这些值将用于这样写功能:

browser.cmd =返回的值。

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

+0

你如何使用这些数据?你是否从你的java应用程序开始使用命令行进程? – AlexR

+0

嗨亚历克斯, 它稍后会用到,但我不能更改java应用程序(专有软件),这就是为什么我提出这个问题。 – FilippSmirnov

回答

0

您不能将任何代码添加到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运行此发现者,发现浏览器,然后通过JNLP运行您的“真实”应用程序,或者,甚至更好地直接从您的发现者传递浏览器作为参数。

如果您能发现“正确的”浏览器,此解决方案将起作用。然而,这样的任务不能用任何跨平台的方式来实现。例如在Windows上,你可以检查注册表,在Linux上它取决于味道等。

其他,可能会很奇怪,但恕我直言,最好的解决办法如下。您可以使用AOP来包装Runtime.exec()方法。现在传递非常特殊的,不存在的参数而不是浏览器,让我们说“我的默认浏览器”。你可以发现这个字符串的方面,并呼吁定期exec(),除非命令等于这个特殊的价值。然而,在你的特殊情况下,你可以调用desktop.browse(new URI(url));(请参阅我的答案的开头)。

此解决方案可能听起来很复杂,但事实上并非如此。你可以使用AspectJ来实现5行长的方面。这个解决方案将解决由运行浏览器的人犯下的“犯罪”,通过手动创建新流程以及您的代码无法更改。这个解决方案将是可移植的,可以在任何平台上工作,并且不依赖于系统上安装的浏览器以及当前用户是否可以运行它们。