Обновите настольное приложение Java

1

Я пытаюсь разработать модуль, который может обновить текущее приложение Java Desktop. Проблема в том, что я должен заменить реальную рабочую банку другой банкой, все время отображая изображение и индикатор выполнения с оставшимся временем процесса обновления.

Одно из решений, о котором я думал, это то, что я могу положить банку в свою основную банку и при запуске процесса обновления извлечь эту вторую банку, которая отобразит изображение и панель progess, а также заменит старую основную банку новая главная баночка. Мой вопрос в том, возможно ли это, и как я могу это сделать. У меня нет большого опыта работы с java и java-упаковкой, поэтому, если у вас есть примеры или ссылки, это будет очень полезно для меня.

Большое спасибо. Р.

  • 0
    Обязательно сообщите нам, если вы успешны или нет
  • 0
    Вы уверены, что имеет смысл обновить ваш «основной интерфейс», не останавливая приложение? Однажды я создал огромное приложение, которое будет поддерживать несколько плагинов; и каждый из этих плагинов может быть обновлен «на лету». Но для того, чтобы обновить ваш «основной интерфейс» ... вам все равно придется «остановить» его (так как вам придется отказаться от загрузчика классов, который вы использовали для загрузки содержимого JAR). Значение: пользователь все равно будет испытывать «отключение»; так зачем все усилия выгрузить JAR, загрузить новый (с индикатором выполнения)? Было бы намного проще просто остановить приложение и получить независимое «обновление приложения».
Показать ещё 2 комментария
Теги:
auto-update
desktop-application
executable-jar

2 ответа

2

Запустите этот код, когда нажимаете кнопку UPDATE.

if(Desktop.isDesktopSupported()){
            try {
                Desktop.getDesktop().open(new File("update.jar"));
                System.exit(0);
            } catch (IOException ex) {                
            }            
        }

Это откроет update.jar и закроет main.jar. Теперь запустите этот код из основного класса update.jar

 if(isUpdateVersionAvailable()) { //first check update from database
      try{
          Thread.sleep(5000);
       } catch(Exception e){
          e.printStackTrace();
       }
       if(copyMainJarFileFromServer()){ //copy newMain.jar from server and paste
            new File("main.jar").delete();
            rename(new File("newMain.jar"));
        }
    }

    boolean isUpdateVersionAvailable() {
              //todo
    }
    boolean copyMainJarFileFromServer() {
              //todo
    }
    void rename(File file){
     file.renameTo(new File("main.jar"));
    }
  • 0
    Вам нужно подождать update.jar, пока не прекратится main.jar
0

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

Он покажет начальный логотип, изображение, которое стандартная java может отображать при запуске. Start0er также можно использовать для перезапуска приложения на другом языке интерфейса.

package starter;
...
public class StarterApp {
    public static void main(String[] args) {
        String workDir = System.getProperty("user.dir");
        Path mainJar = Paths.get(workDir + "...");
        Path nextMainJar = Paths.get(workDir + "...");
        if (Files.exists(nextMainJar)) {
            Files.copy(nextMainJar, mainJar, StandardCopyAction.REPLACE_EXISTING);
        }
        URLClassLoader classLoader = new URLClassLoader(new URL[] {mainJar.toURL()});
        Class<?> appClass = classLoader.find("mainjar.MainApp");
        ... instantiate the app
    }

Поскольку вы видите, что главная банка не должна загружаться с раннего начала, возможно, она не полностью находится на пути к классу, и, следовательно, использование отдельного класса ClassLoader. То же самое можно было бы сделать с основным банком на пути к классу Class.forName("mainjar.MainApp") приложения и с использованием Class.forName("mainjar.MainApp"). Путь класса может быть указан в META-INF/MANIFEST.MF.

Вторичные банки могут находиться в каталоге lib/.

Для тех читателей, которым нужны более модульные, ориентированные на обслуживание, обновляемые приложения, можно сделать приложение OSGi, контейнер для пакетов (= jars), которые обеспечивают обменные службы и управление временем жизни.

Ещё вопросы

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