# JavaInstaller `javainstaller.h`, `javainstaller.cpp` Ставит одну сборку Java из каталога [JavaRuntimeService](JavaRuntimeService.md) в `/java//`. Сборки Temurin приходят архивом, сборки Mojang — деревом отдельных файлов, поэтому путей установки два. Экземпляр держит [LauncherBackend](LauncherBackend.md). Геттеры прогресса такие же, как у других установщиков: `label`, `stage`, `currentFile`, `bytesDone`, `bytesTotal`, `fraction`, плюс `runtimeId`. Сигналы: `started(label)`, `progressChanged()` (не чаще раза в 100 мс), `finished(runtimeId, javaPath)`, `failed(label, message)`, `canceled(label)`. ## install(entry) Если установка уже идёт, вызов молча игнорируется. Иначе: 1. проверяется папка лаунчера; 2. **папка `/java/` удаляется целиком**, если она была, и создаётся заново. Повторная установка — это всегда установка с нуля; 3. дальше одна из двух веток. ### Temurin (`zip`, `tar.gz`) 1. Архив качается в `/cache/java/<имя файла>` через `QSaveFile`, sha256 считается на ходу и сверяется с каталогом. 2. `zip` распаковывается через `QZipReader` по 24 записи за такт таймера, чтобы окно не подвисало. Права из архива переносятся. Записи, которые ведут за пределы папки сборки, останавливают установку. 3. `tar.gz` распаковывается системным `tar -xzf`. Он есть на Linux, macOS и Windows 10 и новее. `QZipReader` tar не умеет, а держать ради этого ещё одну библиотеку незачем. 4. Архив удаляется. Прогресс при загрузке считается в байтах, при распаковке zip — в записях. Для tar прогресса нет. ### Mojang 1. Качается `manifest.json` компонента. Его sha1 из каталога сейчас **не проверяется**. 2. Из `files` строится дерево: папки создаются сразу, ссылки откладываются, файлы ставятся в очередь. 3. До 4 файлов качаются параллельно, sha1 каждого сверяется. При временной ошибке (таймаут, 5xx и т. п.) и при несовпадении хеша файл уходит в конец очереди без паузы. После третьей неудачи установка падает. Файлам с `executable: true` ставится бит исполнения. 4. Ссылки создаются через `QFile::link`. Если не вышло (на Windows без прав разработчика), файл копируется. ### Конец `JavaRuntimeStore::locateBinary()` находит `bin/java`. На Unix ему ставится бит исполнения. `runtime.json` записывается последним: пока его нет, `JavaRuntimeStore` сборку не видит. Поэтому недокачанная сборка в списке не появится, даже если лаунчер упал на середине. При ошибке и при отмене папка сборки и скачанный архив удаляются. ## cancel() Обрывает загрузки и убивает `tar`. `canceled` приходит, когда вернутся все активные запросы. --- При создании этого документа использовался ИИ.