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

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

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

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

Ответы [ 5 ]

10 голосов
/ 24 апреля 2013

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

5 голосов
/ 19 октября 2008

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

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

4 голосов
/ 19 октября 2008

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

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

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

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

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

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

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

3 голосов
/ 19 октября 2008

У меня нет реального опыта работы с веб-стартом Java, кроме как смотреть на него несколько лет назад.

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

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

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

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

0 голосов
/ 09 июля 2015

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

...