Как сменить версию Java для сервера

Подготовка и проверка текущего окружения

1. Подключение к серверу через SSH

Откройте терминал (Linux/macOS) или PowerShell (Windows) и подключитесь к выделенному серверу proxify.cloud:

ssh root@<IP_АДРЕС_ВАШЕГО_СЕРВЕРА>

IP-адрес и пароль root указаны в панели управления proxify.cloud на вкладке «Консоль» или в письме с данными доступа.

2. Проверка установленных версий Java

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

update-alternatives --list java

Типичный вывод на чистом Ubuntu 22.04/24.04:

/usr/lib/jvm/java-11-openjdk-amd64/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
/usr/lib/jvm/java-21-openjdk-amd64/bin/java

Если список пуст или нужной версии нет — переходите к разделу «Установка недостающей версии Java».

3. Определение требуемой версии для вашего сервера

Версия Minecraft Рекомендуемая Java
1.16.5 и ниже Java 8 (OpenJDK 8 / Zulu 8)
1.17 — 1.18 Java 16 / 17
1.19 — 1.20.4 Java 17
1.20.5 — 1.21+ Java 21

Проверьте версию ядра (Paper, Spigot, Fabric, Forge) в файле server.jar или в логах запуска.


Установка недостающей версии Java

4. Обновление списка пакетов

apt update && apt upgrade -y

5. Установка OpenJDK 8 (для старых версий)

В Ubuntu 22.04/24.04 пакет openjdk-8-jdk отсутствует в стандартном репозитории. Подключите репозиторий Azul Zulu (рекомендуется для производительности):

apt install -y gnupg2 software-properties-common
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
add-apt-repository "deb http://repos.azul.com/zulu/deb stable main"
apt update
apt install -y zulu8-jdk

6. Установка OpenJDK 17 / 21 (стандартные репозитории)

# Для Java 17
apt install -y openjdk-17-jdk

# Для Java 21 (Ubuntu 24.04+)
apt install -y openjdk-21-jdk

Если используете Ubuntu 22.04 и нужна Java 21, подключите репозиторий Azul аналогично шагу 5 и установите zulu21-jdk.

7. Проверка успешной установки

update-alternatives --list java

Должен появиться новый путь, например:

/usr/lib/jvm/zulu8-amd64/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
/usr/lib/jvm/java-21-openjdk-amd64/bin/java

Переключение версии Java глобально (system-wide)

8. Интерактивный выбор версии

update-alternatives --config java

Введите номер нужной строки и нажмите Enter. Проверьте:

java -version

9. Настройка JAVA_HOME (важно для скриптов запуска)

Откройте /etc/environment:

nano /etc/environment

Добавьте строку (путь берем из вывода шага 7, без /bin/java):

JAVA_HOME="/usr/lib/jvm/java-21-openjdk-amd64"

Сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X). Примените:

source /etc/environment
echo $JAVA_HOME

Переключение версии Java только для конкретного сервера (Best Practice)

Рекомендуемый способ — не менять системную версию, а прописать полный путь к java в скрипте запуска. Это позволяет держать на одном сервере несколько инстансов на разных версиях Java.

10. Определение полного пути к нужной java

readlink -f $(which java)
# Или для конкретной версии:
ls /usr/lib/jvm/*/bin/java

Пример пути для Java 21: /usr/lib/jvm/java-21-openjdk-amd64/bin/java

11. Редактирование скрипта запуска

Обычно скрипт находится в папке сервера: /home/minecraft/server/start.sh или /opt/minecraft/start.sh.

cd /home/minecraft/server
nano start.sh

Замените строку запуска:

# Было:
java -Xms4G -Xmx4G -jar paper.jar nogui

# Стало (указываем абсолютный путь):
/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xms4G -Xmx4G -jar paper.jar nogui

Если используете screen или systemd — правите соответствующий файл (см. шаги 13-14).

12. Проверка прав на выполнение

chmod +x start.sh

Настройка автозапуска через systemd (производственный стандарт)

На выделенных серверах proxify.cloud рекомендуется использовать systemd для автозапуска после перезагрузки ноды Proxmox.

13. Создание unit-файла

nano /etc/systemd/system/minecraft.service

Содержимое (подставьте свои пути и пользователя):

[Unit]
Description=Minecraft Server (Paper 1.21)
After=network.target

[Service]
WorkingDirectory=/home/minecraft/server
User=minecraft
Group=minecraft
# Указываем конкретную Java версию:
ExecStart=/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xms4G -Xmx4G -jar paper.jar nogui
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
# Лимиты для больших миров
LimitNOFILE=65535
LimitNPROC=65535

[Install]
WantedBy=multi-user.target

Создайте пользователя minecraft заранее: adduser --disabled-password --gecos "" minecraft и выдайте права на папку: chown -R minecraft:minecraft /home/minecraft/server.

14. Активация и запуск

systemctl daemon-reload
systemctl enable minecraft
systemctl start minecraft
systemctl status minecraft

Просмотр логов в реальном времени:

journalctl -u minecraft -f

Работа с панелью proxify.cloud (Proxmox VE)

15. Консоль и управление питанием

В панели proxify.cloud (Proxmox Web GUI):

  • Выберите ваш узел (Node) → Ваш контейнер/VM (обычно CT для LXC или VM для KVM).
  • Вкладка Console — полноценный TTY для работы, если SSH недоступен.
  • Вкладка Summary → кнопки Shutdown / Reboot — используйте для грациозной перезагрузки после смены Java (systemd сам корректно остановит сервер при systemctl reboot).

16. Бэкап перед изменениями (Snapshot)

Перед манипуляциями с Java сделайте снапшот:

  1. В Proxmox выберите VM/CT.
  2. Вкладка BackupSnapshotTake Snapshot.
  3. Введите имя: pre-java-switch-21.
  4. При проблеме — Rollback за 30 секунд.

Для LXC-контейнеров снапшоты работают мгновенно (thin-provisioning ZFS/CEPH на proxify.cloud).


Проверка работоспособности после смены версии

17. Тестовый запуск вручную

Остановите systemd-сервис и запустите вручную для чистого лога:

systemctl stop minecraft
cd /home/minecraft/server
sudo -u minecraft /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xms2G -Xmx2G -jar paper.jar nogui

Дождитесь строки Done (X.Xs)! For help, type "help". Остановите Ctrl+C.

18. Проверка версии в логах сервера

В latest.log найдите строку:

[Server thread/INFO]: Starting minecraft server version 1.21 (protocol 767)
[Server thread/INFO]: Java version: 21.0.3, vendor: Ubuntu

Версия Java в логе должна совпадать с целевой.


Возможные проблемы и решения

Проблема 1: UnsupportedClassVersionError при запуске

Симптом: java.lang.UnsupportedClassVersionError: net/minecraft/server/Main has been compiled by a more recent version of the Java Runtime Причина: Ядро сервера новее установленной Java (например, Paper 1.21 на Java 17). Решение: Установите Java 21 (шаги 5-6) и укажите полный путь в ExecStart или start.sh (шаги 11, 13).

Проблема 2: Error: Could not find or load main class @user_jvm_args.txt

Симптом: Ошибка при запуске Forge/Fabric с файлом аргументов. Причина: Старые версии Java (8/11) некорректно парсят @file с BOM или кодировкой UTF-16. Решение:

  1. Перекодируйте файл: dos2unix user_jvm_args.txt или sed -i '1s/^\xEF\xBB\xBF//' user_jvm_args.txt.
  2. Либо обновите Java до 17/21, где баг исправлен.

Проблема 3: Сервер не стартует после ребута ноды Proxmox

Симптом: systemctl status minecraft показывает inactive (dead). Причина: Unit-файл не включен (enabled) или сеть не поднята к моменту старта. Решение:

systemctl enable minecraft
# Добавьте в [Unit] после network.target:
After=network-online.target
Wants=network-online.target

Выполните systemctl daemon-reload.

Проблема 4: java: command not found в скриптах / кроне

Причина: Переменная PATH в неинтерактивной сессии не содержит /usr/lib/jvm/.../bin. Решение: Всегда используйте абсолютный путь /usr/lib/jvm/java-21-openjdk-amd64/bin/java в скриптах, systemd и cron. Не полагайтесь на update-alternatives для автоматизации.

Проблема 5: Высокое потребление памяти (OOM Killer)

Симптом: Процесс убит системой, в dmesgOut of memory: Killed process. Причина: `-Xmx