Опубликовано: 14 октября 20197 г ТЗ: Написать фичу для софтинки, которая будет при запуске основной программы проверять наличие обновлений и скачивать их с сервера.Примечания: файл основной программы должен заменяться на ново-скаченныйДля начала пишем 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)) {}Дальше сохраняем полученный файлик по ссылке из JSONSystem.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(); И получаем его хеш сумму SHA256byte[] 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А на сегодня все. Спасибо за просмотр Изменено 14 октября 20197 г пользователем gladdos
Опубликовано: 15 октября 20197 г По мне так бредовая тема, ну точней, не для этого форума она здесь, тут 97% - обычные люди, которые не шарят вообще в написании чего-либо. Лучше бы на нормальный форум это залил, а не на форум по майнкрафту ахывха
Опубликовано: 16 октября 20197 г Автор По мне так бредовая тема, ну точней, не для этого форума она здесь, тут 97% - обычные люди, которые не шарят вообще в написании чего-либо. Лучше бы на нормальный форум это залил, а не на форум по майнкрафту ахывхаЯ её написал в раздел для разработчиков для людей которые пишут на java. Есть тут пару человек таких. Тема полезная, если писать софт для кубачей. Для серьёзных проектов подобный код не годится
Создайте аккаунт или войдите в него для комментирования