- Home »

Как написать первую программу на Java
Серверные админы часто сталкиваются с Java-приложениями на продакшене — от Jenkins и Confluence до Elasticsearch и Spring Boot сервисов. Понимание основ Java помогает не только в диагностике проблем, но и в автоматизации задач. Да, можно обойтись bash-скриптами, но иногда нужна более серьёзная артиллерия. Особенно когда речь идёт о парсинге JSON, работе с API или создании простых утилит для мониторинга. Эта статья — практическое руководство для тех, кто хочет быстро освоить базы Java без лишней академической воды.
Как это работает под капотом
Java — это компилируемый язык, который работает в виртуальной машине (JVM). Ваш код компилируется в байт-код, который затем интерпретируется JVM. Это даёт преимущества: write once, run anywhere. Для серверных задач это критично — один JAR-файл запустится на любом дистрибутиве Linux.
Основные компоненты экосистемы:
- JDK (Java Development Kit) — набор инструментов для разработки
- JRE (Java Runtime Environment) — среда выполнения для запуска приложений
- JVM (Java Virtual Machine) — виртуальная машина, которая выполняет байт-код
Процесс компиляции и запуска выглядит так:
Source Code (.java) → Compiler (javac) → Bytecode (.class) → JVM → Machine Code
Быстрая настройка окружения
Первым делом нужно поставить JDK. Рекомендую OpenJDK — он бесплатный и без лицензионных заморочек Oracle.
Для Ubuntu/Debian:
sudo apt update
sudo apt install openjdk-11-jdk
java -version
javac -version
Для CentOS/RHEL:
sudo yum install java-11-openjdk-devel
# или для новых версий
sudo dnf install java-11-openjdk-devel
Если работаете с VPS или выделенным сервером, проверьте, что JAVA_HOME настроен правильно:
echo $JAVA_HOME
# Если пустой, добавьте в ~/.bashrc:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
Первая программа: Hello World и не только
Классический пример, но сразу с практической направленностью:
public class ServerCheck {
public static void main(String[] args) {
System.out.println("Server Status: OK");
System.out.println("Current time: " + System.currentTimeMillis());
System.out.println("Available processors: " + Runtime.getRuntime().availableProcessors());
System.out.println("Free memory: " + Runtime.getRuntime().freeMemory() / 1024 / 1024 + " MB");
}
}
Компиляция и запуск:
javac ServerCheck.java
java ServerCheck
Результат сразу даёт полезную информацию о системе — то, что пригодится в мониторинге.
Практические примеры для серверных задач
Парсинг логов
Простой парсер для анализа access.log:
import java.io.*;
import java.util.regex.*;
public class LogParser {
public static void main(String[] args) {
String logLine = "192.168.1.100 - - [10/Oct/2023:13:55:36 +0000] \"GET /api/status HTTP/1.1\" 200 1234";
Pattern pattern = Pattern.compile("^(\\S+) .* \"(\\w+) (\\S+) HTTP/\\d\\.\\d\" (\\d+) (\\d+)");
Matcher matcher = pattern.matcher(logLine);
if (matcher.find()) {
System.out.println("IP: " + matcher.group(1));
System.out.println("Method: " + matcher.group(2));
System.out.println("URL: " + matcher.group(3));
System.out.println("Status: " + matcher.group(4));
System.out.println("Size: " + matcher.group(5));
}
}
}
Проверка портов
import java.net.*;
import java.io.*;
public class PortChecker {
public static void main(String[] args) {
String host = "localhost";
int[] ports = {22, 80, 443, 3306, 5432};
for (int port : ports) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port), 1000);
System.out.println("Port " + port + ": OPEN");
socket.close();
} catch (IOException e) {
System.out.println("Port " + port + ": CLOSED");
}
}
}
}
Сравнение с альтернативами
Критерий | Java | Python | Bash | Go |
---|---|---|---|---|
Скорость выполнения | Высокая | Средняя | Низкая | Очень высокая |
Потребление памяти | Высокое | Среднее | Низкое | Низкое |
Экосистема | Огромная | Огромная | Ограниченная | Растущая |
Простота развёртывания | Средняя | Высокая | Очень высокая | Очень высокая |
Автоматизация и интеграция
Java отлично подходит для создания более сложных инструментов автоматизации:
Системный мониторинг
import java.lang.management.*;
public class SystemMonitor {
public static void main(String[] args) {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
while (true) {
MemoryUsage heapMemoryUsage = memoryBean.getHeapMemoryUsage();
System.out.println("=== System Stats ===");
System.out.println("CPU Load: " + osBean.getProcessCpuLoad() * 100 + "%");
System.out.println("Heap Memory: " + heapMemoryUsage.getUsed() / 1024 / 1024 + " MB");
System.out.println("Available Processors: " + osBean.getAvailableProcessors());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
break;
}
}
}
}
Интеграция с cron
Создайте скрипт для cron:
#!/bin/bash
cd /opt/monitoring
java -jar system-check.jar > /var/log/system-check.log 2>&1
И добавьте в crontab:
*/5 * * * * /opt/monitoring/run-check.sh
Продвинутые возможности
Работа с JSON (без внешних библиотек)
Для простых случаев можно обойтись встроенными возможностями:
import java.util.regex.*;
public class SimpleJsonParser {
public static String extractValue(String json, String key) {
Pattern pattern = Pattern.compile("\"" + key + "\"\\s*:\\s*\"([^\"]+)\"");
Matcher matcher = pattern.matcher(json);
return matcher.find() ? matcher.group(1) : null;
}
public static void main(String[] args) {
String json = "{\"status\":\"ok\",\"uptime\":\"24h\",\"load\":\"0.5\"}";
System.out.println("Status: " + extractValue(json, "status"));
System.out.println("Uptime: " + extractValue(json, "uptime"));
System.out.println("Load: " + extractValue(json, "load"));
}
}
Создание JAR-файла
Для удобного развёртывания упакуйте в JAR:
# Создайте манифест
echo "Main-Class: ServerCheck" > manifest.txt
# Создайте JAR
jar cfm server-check.jar manifest.txt *.class
# Запустите
java -jar server-check.jar
Интересные факты и нестандартные применения
- JVM tuning: Для серверных приложений критично правильно настроить GC. Попробуйте G1GC для низкой латентности:
java -XX:+UseG1GC -jar app.jar
- Профилирование: Встроенный Flight Recorder поможет найти узкие места:
java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=profile.jfr -jar app.jar
- Containerization: С Java 11+ JVM лучше работает в контейнерах, правильно определяя лимиты памяти
Полезные ссылки
- OpenJDK — основная страница проекта
- Java SE API Documentation — официальная документация
- Apache Maven — система сборки для более сложных проектов
Заключение и рекомендации
Java для серверных админов — это не просто ещё один язык программирования. Это мощный инструмент для создания надёжных утилит мониторинга, автоматизации и интеграции. Особенно полезен, когда bash-скрипты становятся слишком громоздкими, а производительность Python недостаточна.
Рекомендую использовать Java для:
- Парсинга больших логов (регулярные выражения работают быстрее, чем в bash)
- Создания утилит мониторинга с низкой латентностью
- Интеграции с Java-экосистемой (Elasticsearch, Kafka, etc.)
- Разработки микросервисов для внутренних задач
Начните с простых утилит — парсер логов, чекер портов, системный монитор. Постепенно добавляйте функциональность. И помните: в серверном мире важна не только функциональность, но и надёжность. Java даёт и то, и другое.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.