Как лучше всего определить, запускается ли приложение с помощью Webstart?

StackOverflow https://stackoverflow.com/questions/216315

  •  03-07-2019
  •  | 
  •  

Вопрос

Как было ясно из моего недавний вопрос , приложения Swing должны явно вызывать System.exit (), когда они запускаются с помощью средства запуска Sun Webstart (по крайней мере, в Java SE 6).

Я хочу максимально ограничить этот взлом и ищу надежный способ определить, работает ли приложение под Webstart. Сейчас я проверяю, что значение системного свойства " webstart.version " не является нулевым, но я не смог найти никаких гарантий в документации, что это свойство должно быть установлено в будущих версиях / альтернативных реализациях.

Есть ли более эффективные способы (желательно те, которые не ограничивают зависимость от API веб-запуска?)

Это было полезно?

Решение

Когда ваш код запускается через javaws, загружается javaws.jar, и становятся доступны классы API JNLP, от которых вы не хотите зависеть. Вместо того, чтобы проверять системное свойство, которое не гарантировано существует, вы могли бы вместо этого увидеть, существует ли класс API JNLP:

private boolean isRunningJavaWebStart() {
    boolean hasJNLP = false;
    try {
      Class.forName("javax.jnlp.ServiceManager");
      hasJNLP = true;
    } catch (ClassNotFoundException ex) {
      hasJNLP = false;
    }
    return hasJNLP;
}

Это также позволяет избежать необходимости включать javaws.jar в путь к классам при компиляции.

В качестве альтернативы вы можете переключиться на компиляцию с помощью javaws.jar и вместо этого перехватить NoClassDefFoundError:

private boolean isRunningJavaWebStart() {
    try {
        ServiceManager.getServiceNames();
        return ds != null;
    } catch (NoClassDefFoundError e) {
        return false;
    }
}

Использование ServiceManager.lookup (String) и UnavailableServiceException является проблемой, поскольку оба являются частью JNLP API. ServiceManager.getServiceNames () не задокументировано для выброса. Мы специально вызываем этот код для проверки на наличие NoClassDefFoundError.

Другие советы

Используйте javax.jnlp.ServiceManager для получения службы веб-запуска. Если он доступен, вы работаете в Webstart.

См. http://download.java.net /jdk7/docs/jre/api/javaws/jnlp/index.html

Как вы упомянули, проверка свойства System следующим образом, вероятно, является самым чистым способом:

private boolean isRunningJavaWebStart() {
    return System.getProperty("javawebstart.version", null) != null;
}

В производственной системе я использовал вышеупомянутую технику в течение многих лет.

Вы также можете попробовать проверить, есть ли какие-либо свойства, начинающиеся с " jnlpx. " но ни один из них не является действительно "гарантированным" быть там или, насколько я знаю.

Альтернативой может быть попытка создания экземпляра DownloadService, предложенного нами Томом:

private boolean isRunningJavaWebStart() {
    try {
        DownloadService ds = (DownloadService) ServiceManager.lookup("javax.jnlp.DownloadService");
        return ds != null;
    } catch (UnavailableServiceException e) {
        return false;
    }
}

Конечно, в этом есть обратная сторона соединения вашего кода с этим API.

У меня нет никакого реального опыта с запуском Java, за исключением того, что я смотрел на него несколько лет назад.

Как насчет того, чтобы запустить ваше приложение с параметром, который вы определили, чем тот, который вы задали при запуске приложения через веб-запуск Java.

Если вы хотите передать аргументы своему приложению, вы должны добавить их в файл запуска (дескриптор JNLP), используя элементы или.

Затем проверьте, установлены ли эти свойства.

Опять же, это предложение, которое я не написал для JWS, и это может быть не так просто.

Вы можете проверить, является ли текущий загрузчик классов экземпляром com.sun.jnlp.JNLPClassLoader (плагин Java) или sun.plugin2.applet.JNLP2ClassLoader (плагин 2 Java). Несмотря на «апплет» package, апплет, использующий JNLP с плагином Java 2, использует другой загрузчик классов, sun.plugin2.applet.Applet2ClassLoader. Он также работает с OpenJDK.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top