2016-08-18 5 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

Hi Alex, Он используется позже, но я не могу изменить приложение 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 это зависит от вкуса и т. Д.

Другое, может быть странно, но IMHO лучшим решением является следующее. Вы можете использовать AOP для обертывания метода Runtime.exec(). Теперь передайте очень специальный, а не существующий параметр вместо браузера, скажем, «my-default-browser». Вы можете открыть эту строку в аспект и вызвать обычный exec(), если только команда не соответствует этому специальному значению. Однако в вашем специальном случае вы можете вызвать desktop.browse(new URI(url)); (см. Начало моего ответа).

Это решение, вероятно, звучит сложно, но на самом деле это не так. Вы можете реализовать 5-строчный длинный аспект, используя AspectJ, который делает это. Это решение решит «преступление», совершенное кем-то, кто запускает браузер, создавая новый процесс вручную и код которого вы не можете изменить. Это решение будет переносимым и работать на любой платформе и не будет зависеть от того, какие браузеры установлены в системе и может ли текущий пользователь их запускать.