- Home »

Установка Java на CentOS и Fedora
Как же часто заходишь на новый сервер и понимаешь, что Java нет, а нужна прямо сейчас? Знакомо? Особенно если ты работаешь с Enterprise-проектами, где без JVM никуда. Сегодня разберём, как правильно и быстро поставить Java на CentOS и Fedora — две самые популярные RHEL-based дистрибутивы в серверном мире. Покажу не только стандартные способы, но и парочку хитростей, которые сэкономят тебе время и нервы.
Зачем вообще нужна Java на сервере
Java — это не просто язык программирования, это целая экосистема. На серверах она нужна для:
- Веб-приложений (Tomcat, Jetty, Spring Boot)
- Микросервисов и контейнеризации
- Big Data решений (Elasticsearch, Kafka, Hadoop)
- CI/CD инструментов (Jenkins, Maven, Gradle)
- Мониторинга (некоторые версии Prometheus exporters)
Без Java многие современные Enterprise-решения просто не запустятся. Поэтому важно знать, как её правильно установить и настроить.
Различия между дистрибутивами Java
Перед установкой стоит понимать, что Java бывает разная. Вот основные варианты:
Дистрибутив | Лицензия | Поддержка | Рекомендации |
---|---|---|---|
OpenJDK | GPL v2 | Сообщество | Идеально для большинства задач |
Oracle JDK | Коммерческая | Oracle | Только для продакшена с лицензией |
Amazon Corretto | GPL v2 | Amazon | Отличный выбор для AWS |
Azul Zulu | GPL v2 | Azul Systems | Хорошо оптимизирован |
Для серверов я рекомендую OpenJDK — она бесплатная, стабильная и входит в репозитории дистрибутивов.
Установка OpenJDK на CentOS/RHEL
Начнём с самого распространённого случая — установки на CentOS или RHEL. Тут есть несколько способов, и каждый имеет свои плюсы.
Способ 1: Через dnf/yum (рекомендуется)
Самый простой и правильный способ — использовать стандартный пакетный менеджер:
# Обновляем систему
sudo dnf update -y
# Смотрим доступные версии Java
sudo dnf search openjdk
# Устанавливаем Java 11 (LTS версия)
sudo dnf install java-11-openjdk java-11-openjdk-devel -y
# Или Java 17 (новая LTS)
sudo dnf install java-17-openjdk java-17-openjdk-devel -y
# Проверяем установку
java -version
javac -version
Пакет java-11-openjdk-devel
нужен для компиляции — в нём есть javac и другие инструменты разработки.
Способ 2: Установка конкретной версии
Если нужна определённая версия Java, можно быть более конкретным:
# Посмотреть все доступные версии
sudo dnf list available | grep openjdk
# Установить Java 8
sudo dnf install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
# Установить Java 21
sudo dnf install java-21-openjdk java-21-openjdk-devel -y
Управление версиями с alternatives
Когда установлено несколько версий Java, используй alternatives
для переключения:
# Настроить альтернативы для java
sudo alternatives --config java
# Настроить альтернативы для javac
sudo alternatives --config javac
# Посмотреть текущие альтернативы
sudo alternatives --display java
Установка OpenJDK на Fedora
На Fedora процесс почти идентичен, но есть нюансы:
# Обновляем систему
sudo dnf update -y
# Ищем доступные пакеты Java
sudo dnf search java-*-openjdk
# Устанавливаем последнюю стабильную версию
sudo dnf install java-latest-openjdk java-latest-openjdk-devel -y
# Или конкретную версию
sudo dnf install java-17-openjdk java-17-openjdk-devel -y
# Проверяем
java -version
which java
На Fedora обычно доступны более свежие версии Java, чем на CentOS.
Установка Oracle JDK (если очень нужно)
Иногда требуется именно Oracle JDK. Вот как его поставить:
# Скачиваем Oracle JDK (пример для версии 17)
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_rpm.rpm
# Устанавливаем
sudo rpm -ivh jdk-17_linux-x64_rpm.rpm
# Настраиваем alternatives
sudo alternatives --install /usr/bin/java java /usr/java/latest/bin/java 1
sudo alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 1
# Выбираем Oracle JDK
sudo alternatives --config java
Важно: Oracle JDK требует лицензию для использования в продакшене. Для тестов и разработки можно использовать бесплатно.
Настройка переменных окружения
Правильная настройка JAVA_HOME критически важна для многих приложений:
# Находим путь к Java
readlink -f $(which java)
# Создаём файл с переменными окружения
sudo tee /etc/profile.d/java.sh << 'EOF'
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
export PATH=$JAVA_HOME/bin:$PATH
EOF
# Применяем изменения
source /etc/profile.d/java.sh
# Проверяем
echo $JAVA_HOME
Альтернативный способ для OpenJDK:
# Для Java 11
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' | sudo tee -a /etc/environment
# Для Java 17
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' | sudo tee -a /etc/environment
# Перезагружаем окружение
source /etc/environment
Автоматизация установки
Для автоматизации можно создать простой скрипт:
#!/bin/bash
# Скрипт установки Java на RHEL-based системах
set -e
JAVA_VERSION=${1:-11}
INSTALL_DEVEL=${2:-yes}
echo "Устанавливаем Java $JAVA_VERSION..."
# Определяем пакетный менеджер
if command -v dnf &> /dev/null; then
PKG_MGR="dnf"
elif command -v yum &> /dev/null; then
PKG_MGR="yum"
else
echo "Не найден пакетный менеджер"
exit 1
fi
# Устанавливаем пакеты
PACKAGES="java-${JAVA_VERSION}-openjdk"
if [[ "$INSTALL_DEVEL" == "yes" ]]; then
PACKAGES="$PACKAGES java-${JAVA_VERSION}-openjdk-devel"
fi
sudo $PKG_MGR install -y $PACKAGES
# Настраиваем JAVA_HOME
JAVA_HOME="/usr/lib/jvm/java-${JAVA_VERSION}-openjdk"
echo "export JAVA_HOME=$JAVA_HOME" | sudo tee /etc/profile.d/java.sh
echo "export PATH=\$JAVA_HOME/bin:\$PATH" | sudo tee -a /etc/profile.d/java.sh
# Применяем настройки
source /etc/profile.d/java.sh
echo "Java $JAVA_VERSION установлена успешно!"
java -version
Сохрани скрипт как install_java.sh
и запускай:
chmod +x install_java.sh
./install_java.sh 17 yes
Тестирование установки
После установки важно проверить, что всё работает корректно:
# Проверяем версию Java
java -version
# Проверяем компилятор
javac -version
# Проверяем JAVA_HOME
echo $JAVA_HOME
# Создаём тестовый файл
cat > HelloWorld.java << 'EOF'
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
System.out.println("Java Home: " + System.getProperty("java.home"));
System.out.println("Java Version: " + System.getProperty("java.version"));
}
}
EOF
# Компилируем и запускаем
javac HelloWorld.java
java HelloWorld
# Убираем тестовые файлы
rm HelloWorld.java HelloWorld.class
Оптимизация для серверных нагрузок
Для продакшен-серверов стоит настроить JVM параметры:
# Создаём файл с JVM опциями
sudo tee /etc/profile.d/jvm.sh << 'EOF'
# Оптимизация для серверных нагрузок
export JVM_OPTS="-server -Xms1g -Xmx4g -XX:+UseG1GC -XX:+UseStringDeduplication"
export JAVA_OPTS="$JVM_OPTS -Djava.awt.headless=true"
EOF
source /etc/profile.d/jvm.sh
Основные параметры:
-server
— включает серверную JVM-Xms/-Xmx
— начальный и максимальный размер кучи-XX:+UseG1GC
— использует G1 сборщик мусора-Djava.awt.headless=true
— отключает GUI (важно для серверов)
Частые проблемы и их решения
Проблема: "Command not found"
Если после установки Java не найдена:
# Проверяем, действительно ли установлена Java
rpm -qa | grep openjdk
# Ищем исполняемые файлы
find /usr -name "java" -type f 2>/dev/null
# Добавляем в PATH
echo 'export PATH=/usr/lib/jvm/java-11-openjdk/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
Проблема: Конфликт версий
При работе с несколькими версиями Java:
# Смотрим установленные версии
sudo alternatives --display java
# Удаляем ненужные версии
sudo dnf remove java-1.8.0-openjdk
# Или управляем через alternatives
sudo alternatives --remove java /usr/lib/jvm/java-1.8.0-openjdk/bin/java
Проблема: Недостаточно памяти
Java приложения могут потреблять много памяти:
# Мониторинг использования памяти JVM
jstat -gc [PID]
# Настройка лимитов памяти
export JAVA_OPTS="-Xms512m -Xmx2048m"
# Для systemd сервисов
sudo systemctl edit myapp.service
Интеграция с другими инструментами
Java часто используется совместно с другими инструментами:
С Maven
# Устанавливаем Maven
sudo dnf install maven -y
# Проверяем интеграцию
mvn -version
С Gradle
# Устанавливаем Gradle через SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install gradle
С Docker
# Dockerfile для Java приложения
FROM centos:8
# Устанавливаем Java
RUN dnf install -y java-11-openjdk java-11-openjdk-devel
# Настраиваем JAVA_HOME
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk
# Копируем приложение
COPY app.jar /app/app.jar
# Запускаем
CMD ["java", "-jar", "/app/app.jar"]
Мониторинг и логирование
Для продакшена важно настроить мониторинг Java приложений:
# Включаем JMX мониторинг
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9999"
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
# Настраиваем логирование GC
export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:gc.log:time,tags"
Безопасность
Несколько важных моментов по безопасности:
- Обновляй Java регулярно — в ней часто находят уязвимости
- Ограничивай сетевой доступ для Java приложений
- Используй security manager для критичных приложений
- Настраивай SSL/TLS правильно
# Обновление Java
sudo dnf update java-*-openjdk
# Проверка безопасности
java -version | grep -i security
Производительность на разных серверах
Если работаешь с разными типами серверов, учитывай особенности:
Тип сервера | Рекомендуемая версия Java | Настройки JVM |
---|---|---|
VPS | Java 11/17 | -Xms256m -Xmx1g |
Выделенный сервер | Java 17/21 | -Xms2g -Xmx8g |
Контейнер | Java 17+ (лучше работает с cgroups) | -XX:+UseContainerSupport |
Альтернативные способы установки
Кроме стандартных репозиториев, есть другие варианты:
SDKMAN!
Отличный инструмент для управления версиями Java:
# Устанавливаем SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# Смотрим доступные версии Java
sdk list java
# Устанавливаем конкретную версию
sdk install java 17.0.2-open
# Переключаемся между версиями
sdk use java 11.0.2-open
Через архивы
Для особых случаев можно установить из архива:
# Скачиваем архив OpenJDK
wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz
# Распаковываем
sudo tar -xzf openjdk-17.0.2_linux-x64_bin.tar.gz -C /opt/
# Создаём символическую ссылку
sudo ln -s /opt/jdk-17.0.2 /opt/java
# Настраиваем окружение
echo 'export JAVA_HOME=/opt/java' | sudo tee /etc/profile.d/java.sh
echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/java.sh
Интересные факты и хитрости
Несколько полезных фишек, которые пригодятся:
- jshell — интерактивная консоль Java (доступна с Java 9+)
- Flight Recorder — встроенный профайлер с низким overhead
- Application Class-Data Sharing — ускоряет старт приложений
- Graal VM — компилирует Java в native binaries
# Запуск jshell
jshell
# Включение Flight Recorder
java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=recording.jfr MyApp
# Создание CDS архива
java -Xshare:dump -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=app.jsa
# Использование CDS
java -Xshare:on -XX:SharedArchiveFile=app.jsa MyApp
Заключение и рекомендации
Установка Java на CentOS и Fedora — процесс несложный, но важно делать это правильно. Вот мои основные рекомендации:
- Используй OpenJDK — она бесплатна и полностью совместима с Oracle JDK
- Выбирай LTS версии (8, 11, 17, 21) для продакшена
- Настраивай JAVA_HOME правильно — многие приложения на это полагаются
- Используй alternatives для управления версиями
- Оптимизируй JVM параметры под свои нагрузки
- Регулярно обновляй Java для безопасности
Для большинства серверных задач достаточно стандартной установки через dnf/yum. Если нужно что-то особенное — есть SDKMAN! и ручная установка из архивов.
Java — это мощный инструмент, и правильная установка — первый шаг к стабильной работе твоих приложений. Удачи в настройке!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.