Home » Как написать первую программу на Java
Как написать первую программу на Java

Как написать первую программу на 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 даёт и то, и другое.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked