Приложение Java Web Start не может обновиться с помощью ярлыка

3

Я развернул настольное приложение Java (FX), используя Java Web Start. Обновления работают нормально, но только если я запускаю загруженный JNLP вручную, они не работают с ярлыками, установленными на рабочем столе и в меню.

Вот мой JNLP:

<?xml version="1.0" encoding="utf-8"?>
<jnlp codebase="http://192.168.1.85/deploy/" spec="1.0" xmlns:jfx="http://javafx.com" href="Companyapp.jnlp">

    <information>

        <title>Companyapp</title>
        <vendor>Media Citizens</vendor>
        <description>Companyapp Presentation Desktop</description>
        <homepage href="http://192.168.1.85/deploy/"/>

        <offline-allowed/>

        <shortcut online="false" install="true">
            <desktop />
            <menu submenu="Companyapp"/>
        </shortcut>

        <icon kind="shortcut"   href="http://192.168.1.85/deploy/icons/32x32.gif"           width="32"      height="32"     />
        <icon kind="shortcut"   href="http://192.168.1.85/deploy/icons/64x64.gif"           width="64"      height="64"     />
        <icon kind="splash"     href="http://192.168.1.85/deploy/icons/splash_screen.jpg"   width="1024"    height="768"    />
    </information>

    <update check="always" policy="always" />

    <security>
        <all-permissions/>
    </security>

    <resources>
        <jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/>
    </resources>

    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>

        <jar href="http://192.168.1.85/deploy/Companyapp.jar" main="true"                                   download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/async-http-client-1.7.8.jar"             size="477791"   download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/commons-codec-1.7.jar"                       size="259600"   download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/commons-io-2.4.jar"                          size="185140"   download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/commons-lang3-3.1.jar"                       size="315805"   download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/commons-logging-1.1.jar"                 size="52915"    download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/json-simple-1.1.1.jar"                       size="23737"    download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/slf4j-api-1.7.2.jar"                     size="26083"    download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/sqlite-jdbc-3.7.15-SNAPSHOT.jar"         size="3702257"  download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/ws-commons-util-1.0.2.jar"                   size="34407"    download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/xmlrpc-client-3.1.3.jar"                 size="58573"    download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/xmlrpc-common-3.1.3.jar"                 size="109131"   download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/zt-zip-1.5.jar"                              size="33059"    download="eager"    />
        <jar href="http://192.168.1.85/deploy/libs/javaws.jar"                                  size="893738"   download="eager"    />
    </resources>

    <jfx:javafx-desc  width="0" height="0" main-class="com.mediacitizens.companyapp.presentation.desktop.Main"  name="Company App" />
    <application-desc main-class="com.mediacitizens.companyapp.presentation.desktop.Main" />
</jnlp>

На всякий случай, вот часть моей программы, которая устанавливает ярлыки:

// install shortcuts
try
{
    IntegrationService is = null;
    try
    {
        is = (IntegrationService) ServiceManager.lookup("javax.jnlp.IntegrationService");
    }
    catch (UnavailableServiceException use)
    {
        throw new ApplicationError(use.getLocalizedMessage());
    }

    if (!is.hasDesktopShortcut())
    {
        if (!is.requestShortcut(true, true, "Companyapp"))
        {
            throw new ApplicationError("Integration failed.");
        }
    }
    else
    {
        //initialController.dialog("Shortcuts exist", "Go away!", null);
    }
}
catch (ApplicationError e)
{
    initialController.dialog("Failed to integrate a shortcut on your computer.\nCause: " + e.getLocalizedMessage(), "I understand", null);
}

Обновление 1

Я удалил <offline-allowed /> и теперь он обновляется из ярлыка, но я не могу запустить приложение в автономном режиме. Так видимо я должен уметь? Это дает мне эту ошибку:

Изображение 174551

Чтобы быть справедливым, я пытаюсь подключиться к серверу при запуске, но это не вызывает этой ошибки: он имеет 2-секундный тайм-аут и выглядит следующим образом:

try
{
    isOffline = !(InetAddress.getByName(Config.domain + "." + Config.serverDomain).isReachable(2000));
}
catch (IOException e)
{
    e.printStackTrace();
}

Безрезультатно, мой код не упоминается в ошибке, поэтому я думаю, если у меня нет <offline-allowed />, я вообще не могу запустить приложение офлайн? Это правда? Если да, это серьезная проблема для развертывания с JWS, я, вероятно, просто полностью откажу его...


Обновление 2

Я думаю, что я могу это сделать: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7121086 кто-нибудь знает обходной путь?

В этой ошибке говорится

Получите rif каждого jnlp, используемого как расширение. означает смешивать все в одном. При этом условии, которое работает

Итак, я должен смешивать JavaFX как банку с JNLP?

Теги:
javafx
deployment
java-web-start
updates

5 ответов

2
Лучший ответ

Мне удалось решить проблему без удаления <offline-allowed />, вот JNLP:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="6.0+" codebase="http://192.168.1.85/deploy/" href="Companyapp.jnlp">

    <information>
        <title>Companyapp</title>
        <vendor>Media Citizens</vendor>
        <description>Companyapp Presentation Desktop</description>
        <homepage href="http://192.168.1.85" />

        <shortcut online="true" install="true">
            <desktop />
            <menu submenu="Companyapp" />
        </shortcut>

        <offline-allowed />

        <icon kind="shortcut" href="http://192.168.1.85/deploy/icons/32x32.gif" width="32" height="32" />
        <icon kind="shortcut" href="http://192.168.1.85/deploy/icons/64x64.gif" width="64" height="64" />
        <icon kind="splash" href="http://192.168.1.85/deploy/icons/splash_screen.jpg" width="1024" height="768" />
    </information>

    <update check="always" policy="prompt-update" />

    <security>
        <all-permissions />
    </security>

    <resources>
        <jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp" />
    </resources>

    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" />

        <jar href="http://192.168.1.85/deploy/Companyapp.jar" main="true" />
        <jar href="http://192.168.1.85/deploy/libs/async-http-client-1.7.8.jar" size="477791" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/commons-codec-1.7.jar" size="259600" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/commons-io-2.4.jar" size="185140" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/commons-lang3-3.1.jar" size="315805" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/commons-logging-1.1.jar" size="52915" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/json-simple-1.1.1.jar" size="23737" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/slf4j-api-1.7.2.jar" size="26083" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/sqlite-jdbc-3.7.15-SNAPSHOT.jar" size="3702257" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/ws-commons-util-1.0.2.jar" size="34407" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/xmlrpc-client-3.1.3.jar" size="58573" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/xmlrpc-common-3.1.3.jar" size="109131" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/zt-zip-1.5.jar" size="33059" download="eager" />
        <jar href="http://192.168.1.85/deploy/libs/javaws.jar" size="893738" download="eager" />
    </resources>

    <application-desc main-class="com.mediacitizens.companyapp.presentation.desktop.Main" />
</jnlp>

И чтобы убедиться, что сервер правильно обрабатывает обновления, установите mod_expires для Apache и поместите этот .htaccess в папку, где JNLP и JAR:

DirectoryIndex index.html

AddType application/x-java-jnlp-file .jnlp
AddType application/x-java-archive .jar
AddType application/x-java-archive-diff .jardiff

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "modification"
</IfModule>
  • 0
    Что раньше заставляло его не работать, и каково это в вашем обновленном jnlp, который позволяет ему работать?
  • 2
    Я не могу сказать со 100% уверенностью - если за последние пару недель я узнал что-нибудь о том, что JWS очень непредсказуемо, и отсутствие хорошей документации не поможет. Но я думаю, что это в основном .htacess и изменение shortcut online="false" на shortcut online="true"
2

Что это заставило его не работать до этого и что это с твоим обновленный jnlp, который позволяет ему работать?

Проблема заключается в разметке JNLP:

Контейнер ярлыков имеет атрибут: online = "false".

Это вызывает настройку ярлыка на рабочем столе, так что он запускает javaws с параметром -offline, поэтому он запускается с кэшированным jnlp.

Проблема сохраняется даже при исправлении jnlp на сервере, поскольку локально кешированный jnlp все еще используется ярлыком.

Лучшим решением является указание пользователю снова запустить приложение из браузера, так как это заставит javaws обновить ярлык на клиенте до правильных параметров - при условии, что вы исправили jnlp на сервере.

На самом деле нет причины указывать этот атрибут, так как по умолчанию это "истина", что приведет к ожидаемому поведению, но сеть на плаву с разметкой jnlp, которая устанавливает значение false. Также практически нет документации по этому атрибуту, что делает проблему еще хуже.

Per

1

Удалите <offline-allowed/> из файла JNLP.

Если указано офлайн-разрешено, приложение можно запустить автономно от Java Application Cache Viewer, а ярлыки могут быть которые запускают приложение в автономном режиме.

Если приложение запущено в автономном режиме, оно не будет проверять наличие обновлений и вызов API BasicService.isOffline() вернет true.

Элемент offline-allowed также контролирует, как проверяет Java Web Start для обновления приложения. Если элемент не указан - например, приложение должно быть онлайн для запуска - Java Web Start будет всегда проверяйте обновленную версию перед запуском приложения. И если будет найдено обновление, новое приложение будет загружено и запущен. Таким образом, гарантируется, что пользователь всегда запускает последние версии приложения. Однако приложение должно быть запущено в Интернете.

Если указано офлайн-разрешено, Java Web Start также проверит, чтобы увидеть если обновление доступно. Однако, если приложение уже скачанный чек будет истекать через несколько секунд, и в этом случае вместо этого будет запущено кэшированное приложение. Учитывая разумное быстрое подключение к серверу, последняя версия приложения будет обычно запускаются, но это не гарантируется. Однако приложение, может выполняться автономно.

Источник: http://docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/syntax.html

  • 0
    но мне нужно, чтобы приложение могло работать в автономном режиме ...
  • 0
    попробуй, все равно будет работать
Показать ещё 2 комментария
0

У меня была эта проблема только потому, что я не позволял приложению открывать время, достаточное для завершения обновления.

Если у вас есть эта опция: update check = "background" в JNLP, подождите некоторое время, прежде чем закрыть приложение, чтобы разрешить завершение обновления (работающего на фоне).

0

Несмотря на то, что после всех советов эта проблема сохранялась для меня (используя Java 8 runtime в Windows).

Я решил это в моем случае, убедившись, что веб-сервер, обслуживающий JNLP файл, добавляет заголовок Last-Modified. (Я использовал встроенный экземпляр Jetty, и, похоже, Jetty ResourceHandler этого не делает). Я также добавил дату истечения срока в прошлом для jnlp, но я не уверен, что это было необходимо.

Мой старый ответ, который МОЖЕТ помочь некоторым: Я также поместил тег обновления после тега безопасности, как указано здесь JNLP не обновляется, хотя есть обновление = "всегда" "Политика =" всегда "

Проблема временно исчезла после этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню