Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以使用JNLP安装浏览器_Java_Jnlp - Fatal编程技术网

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

Java 是否可以使用JNLP安装浏览器,java,jnlp,Java,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/> </in

我正在使用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=firefox
如您所见,我设置了一个变量browser.cmd:

<argument>-browser.cmd=firefox</argument>
-browser.cmd=firefox
它在my.jar中用于在指定的浏览器中打开HTML内容。但不幸的是,它在某些情况下并不起作用

因此,我认为可以在JNLP中编写函数,该函数将返回安装在系统中的浏览器列表。这些值的使用方式如下:

browser.cmd=返回的值


可以通过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运行此发现程序,发现浏览器,然后通过JNLP运行“真正的”应用程序,或者更好,直接从发现程序将浏览器作为参数传递

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

另一个可能很奇怪,但我认为最好的解决方案是以下几点。您可以使用AOP包装
Runtime.exec()
方法。现在传递非常特殊的,不是现有的参数,而是浏览器,让我们说“我的默认浏览器”。您可以在aspect中发现此字符串并调用regular
exec()
,除非该命令等于此特殊值。但是在您的特殊情况下,您可以调用
desktop.browse(新URI(url))(请参阅我答案的开头)


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

不能向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()
方法。现在传递非常特殊的,不是现有的参数,而是浏览器,让我们说“我的默认浏览器”。您可以在aspect中发现此字符串并调用regular
exec()
,除非该命令等于此特殊值。但是在您的特殊情况下,您可以调用
desktop.browse(新URI(url))(请参阅我答案的开头)


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

您如何使用这些数据?您是否使用java应用程序中的命令行启动进程?嗨,Alex,稍后会使用它,但我无法更改java应用程序(专有软件),这就是我提出此问题的原因。您如何使用此数据?您是否使用java应用程序中的命令行启动该过程?嗨,Alex,稍后会使用它,但我无法更改java应用程序(专有软件),这就是我提出此问题的原因。