Перейти к публикации

Пишем апдейтер к вашим программам


Рекомендованные сообщения

ТЗ: Написать фичу для софтинки, которая будет при запуске основной программы проверять наличие обновлений и скачивать их с сервера.

Примечания: файл основной программы должен заменяться на ново-скаченный

Для начала пишем JSON файлик по подобной структуре.

package ru.patay.entities;

public class Information {
public String version;
public String url;
public String sha256sum;
}

заливаем его на сервер.
после psvm открываем try…catch блок ловим подобные ошибки: IOException | NoSuchAlgorithmException | URISyntaxException e

Гуглим GSON, коннектим его к сборщику. Впрочем для ленивых вот на него ссылка

Не отходя от конфигов сборщика (GRADLE)

Пилим подобный линковщик:

jar {
manifest { attributes('Main-Class': "${project.group}.Main", 'Implementation-Version': version) }
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

Выше указываем ТЕКУЩУЮ ВЕРСИЮ и основной пакет

group 'ru.patay'
version '1.0-SNAPSHOT'

Теперь все апдейты (будущие) мы меняем в конфигах сборщика.

Идем по нексусу (так называемому пожилому нексилю)

 

Объявляем InputStream до JSON файлика и заодно его читаем

InputStream is = new URL("https://example.com/package.json").openConnection().getInputStream();
String result = new BufferedReader(new InputStreamReader(is)).lines()
.collect(Collectors.joining("\n"));
is.close();

Используем GSON ( Я так и не разобрался с встроенным JSON, пришлось использовать сторонние фреймоворки)

Gson gson = new Gson();
Information information = gson.fromJson(result, Information.class);

Так, первая проверка на сравнение текущей версии и свеже-полученной

if (!Main.class.getPackage().getImplementationVersion().equals(information.version)) {}

Дальше сохраняем полученный файлик по ссылке из JSON

System.out.println("New version found!");
is = new URL(information.url).openConnection().getInputStream();
File file = new File("tmp");
Files.copy(is, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
is.close();

И получаем его хеш сумму SHA256

byte[] buffer = new byte[8192];
int count;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
while ((count = bis.read(buffer)) > 0) {
digest.update(buffer, 0, count);
}
bis.close();
String downloadedSHA = new BigInteger(1, digest.digest()).toString(16).toLowerCase();

И сравниваем полученную хеш-сумму из JSON`a с хешсуммой скаченного файла

if (information.sha256sum.toLowerCase().equals(downloadedSHA)) { } else throw new IOException("SHA256SUM does not equals!");

Заменяем текущий файл скаченным файлом

File current = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI());
FileOutputStream fos = new FileOutputStream(current);
FileInputStream fis = new FileInputStream(file);
fos.flush();
while (fis.available() > 0)
fos.write(fis.read());
fos.close();
fis.close();
file.delete();

Остается только запустить

Runtime.getRuntime().exec("java -jar " + current.getAbsolutePath());
System.exit(0);

Готовый пример лежит тут : GitHub

А на сегодня все. Спасибо за просмотр

Изменено пользователем gladdos
Ссылка на комментарий

По мне так бредовая тема, ну точней, не для этого форума она здесь, тут 97% - обычные люди, которые не шарят вообще в написании чего-либо. Лучше бы на нормальный форум это залил, а не на форум по майнкрафту ахывха

Ссылка на комментарий

По мне так бредовая тема, ну точней, не для этого форума она здесь, тут 97% - обычные люди, которые не шарят вообще в написании чего-либо. Лучше бы на нормальный форум это залил, а не на форум по майнкрафту ахывха

Я её написал в раздел для разработчиков для людей которые пишут на java. Есть тут пару человек таких. Тема полезная, если писать софт для кубачей. Для серьёзных проектов подобный код не годится

Ссылка на комментарий

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...