Я пытаюсь разработать модуль, который может обновить текущее приложение Java Desktop. Проблема в том, что я должен заменить реальную рабочую банку другой банкой, все время отображая изображение и индикатор выполнения с оставшимся временем процесса обновления.
Одно из решений, о котором я думал, это то, что я могу положить банку в свою основную банку и при запуске процесса обновления извлечь эту вторую банку, которая отобразит изображение и панель progess, а также заменит старую основную банку новая главная баночка. Мой вопрос в том, возможно ли это, и как я могу это сделать. У меня нет большого опыта работы с java и java-упаковкой, поэтому, если у вас есть примеры или ссылки, это будет очень полезно для меня.
Большое спасибо. Р.
Запустите этот код, когда нажимаете кнопку 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"));
}
У вас может быть стартовая банка, которая проверяет наличие обновлений и запускает приложение из основной банки.
Он покажет начальный логотип, изображение, которое стандартная 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), которые обеспечивают обменные службы и управление временем жизни.