Java#

Java — это строго типизированный объектно-ориентированный язык программирования с открытым исходным кодом. Целью создателей было разработать язык, способный работать на любых устройствах, и это стало возможным благодаря концепции «пиши один раз, запускай везде» (WORA - Write Once Run Always). После компиляции программы на Java исполняются на виртуальной машине Java (JVM).

Java Development Kit (JDK)#

Для разработки приложений в Astra Linux Special Edition необходимо установить пакет JDK (комплект разработки на Java), который включает в себя компилятор и интерпретатор Java, JRE (Java Runtime Environment) и JVM (Java Virtual Machine).

Примечание

JVM — виртуальная машина Java,которая загружает .class-файлы, содержащие байт-код, и выполняет их.

JRE — минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, с подключенной стандартной библиотекой классов и другими библиотеками, но без компилятора и других средств разработки (JRE уже включает в себя - JVM).

JDK — комплект разработки на Java (включает в себя JRE с расширенным набором доступных классов и средства разработки).

Основные пакеты для разработки на Java (варианты пакетов JDK)#

Пакет

Версия

Репозиторий

Описание

openjdk-17-jdk

17.0.13+11-2~deb12u1

extended

Комплект разработки ПО на Java

Axiom JDK

21.0.7+9

Axiom JDK

Дистрибутив для запуска, компиляции и отладки приложений

ГосJava

11.0.26.8-3+alse18

Лаборатория 50

ГосJava 11 JRE

Примечание

Рекомендуемыми для разработки JDK в Astra Linux являются Axiom JDK Pro (лицензионное) и ГосJava (опенсорсное).

Примечание

Установка Axiom JDK (опенсорсное) из .deb-пакета:

wget https://download.axiomjdk.ru/java/17.0.1+12/bellsoft-jdk17.0.1+12-linux-amd64.deb
sudo apt install ./bellsoft-jdk17.0.1+12-linux-amd64.deb

Подробнее об установке читайте в руководстве по установке Axiom JDK 17.0.1+12.

Подробнее о составе OpenJDK:

  • java - утилита, которая загружает .class файлы и интерпретирует байт-код в машинные инструкции,

  • javac - компилятор, который транслирует исходный код в байт-код,

  • javadoc - утилита, которая преобразует комментарии в исходном коде в документацию,

  • jps - Java Virtual Machine Process Tool показывает список запущенных java-машин и может показать доп.информацию,

  • javap - дизассемблер для java,

  • JConsole - Java Manager and Monitoring Unit (утилита для мониторинга и управления запущенными приложениями),

  • jstack – утилита, которая предоставляет информацию о Java-процессе и потоках выполнения, позволяет снять thread-dump для отслеживания состояния потоков.

Дополнительные пакеты#

Пакет

Версия

Репозиторий

Описание

maven

3.8.7-1

extended

Инструмент для автоматической сборки проектов на Java и др. языках

gradle

4.4.1-18+b1

extended

Система для автоматической сборки проектов (в т.ч. на Java)

OpenIDE

21.0.5+9-b1

Axiom JDK

IDE для разработки (рекомендуемое)

Eclipse

4.25.0

eclipse

IDE для разработки

IntelliJ IDEA

2024.3.4

jetbrains

IDE для разработки

Примечание

OpenIDE — бесплатная лицензионно чистая IDE на базе IntelliJ IDEA Community Edition с открытым исходным кодом. Развитием OpenIDE занимается некоммерческое партнерство, основанное компаниями «Группа Астра», Haulmont и Axiom JDK. OpenIDE предлагает расширенную поддержку Spring и Docker, чего нет в IntelliJ IDEA Community Edition. В OpenIDE пакет Axiom JDK (бесплатный) доступен для скачивания напрямую из окна выбора JDK. Добавлена удобная интеграция с GitFlic.

Системы управления проектами#

Gradle и Maven — это два популярных инструмента для автоматизации сборки проектов, используемые в экосистеме Java. Оба инструмента помогают управлять зависимостями, процессом сборки, тестированием и развертыванием приложений, но делают это по-разному и имеют свои особенности.

Создание проекта (без IDE и систем управления)#

  • Установить JDK (например, OpenJDK из репозитгориев Astra Linux Special Edition):

sudo apt install openjdk-17-jdk
  • Создать директорию для проекта и перейти в неё:

mkdir MyJavaProject
cd MyJavaProject
  • Сохранить код в файл HelloWorld.java:

// Основной класс HelloWorld, содержащего метод main (точка входа программы)

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Привет, мир!");
    }
}
  • Компиляция java-файла (в результате создастся файл HelloWorld.class, который является байт-кодом вашей программы):

javac HelloWorld.java
  • Запуск программы (указывается имя основного класса программы):

java HelloWorld

В результате выведется строка «Привет, мир!».

Сборка и упаковка#

  • Для создания исполняемого Java приложения необходимо создать manifest.txt с содержимым:

Main-Class: HelloWorld

Примечание

Убедитесь, что в конце файла manifest.txt есть символ новой строки.

  • Создание JAR-файла:

jar cfm HelloWorld.jar manifest.txt HelloWorld.class

Здесь параметр «c» обозначает создание нового архива, параметр «f» указывает имя создаваемого файла, параметр «m» указывает файл манифеста.

  • Запуск JAR-файла (если всё сделано корректно, приложение будет запущено):

java -jar MyProject.jar

Выбор активной версии Java#

  • Просмотр всех доступных версий SDK и выбор активной:

sudo update-alternatives --config java
  • Настройка автоматической установки окружения Java после перезагрузки:

echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/" | sudo tee /etc/profile.d/java.sh
  • Загрузка окружения Java в текущую пользовательскую сессию:

source /etc/profile.d/java.sh
  • Проверка активной версии Java:

java -version

Maven#

Maven — это система управления проектами, разработанная Apache. Базируется на концепции управления зависимостями, определяемых в файле pom.xml (Project Object Model). Этот файл включает в себя информацию о проекте, его плагинах, зависимостях и других конфигурациях.

Когда вы запускаете команду Maven, он читает свой pom.xml, устанавливает необходимые зависимости, компилирует исходный код, запускает тесты и пакует итоговое приложение (например, в формат JAR или WAR). Maven использует концепцию «жизненного цикла» проекта с четко определенными фазами: компиляция, тестирование, упаковка и развертывание.

Примечание

Мaven хорошо интегрируется с IDE, что упрощает управление проектами.

Архетипы в Maven — шаблонные проекты, которые позволяют создавать различные типы проектов (больше об архетипах Maven).

Жизненный цикл проекта в Maven#

Существует 9 фаз построения приложения, выполняющихся последовательно:

  1. clean — удаляются все скомпилированные файлы из каталога target (место, в котором сохраняются готовые артефакты);

  2. validate — идет проверка, вся ли информация доступна для сборки проекта;

  3. compile — компилируются файлы с исходным кодом;

  4. test — запускаются тесты;

  5. package — упаковываются скомпилированные файлы (в jar и др. архивы);

  6. verify — выполняются проверки для подтверждения готовности упакованного файла;

  7. install — пакет помещается в локальный репозиторий. Теперь он может использоваться другими проектами как внешняя библиотека;

  8. site — создается документация проекта;

  9. deploy — собранный архив копируется в удаленный репозиторий.

Пример запуска фазы публикации приложения:

mvn install

Создание приложения (Maven без IDE)#

Пункт 1#

  • Установить пакеты JDK (например, OpenJDK) и Maven:

sudo apt install openjdk-17-jdk
sudo apt install maven

Пункт 2#

  • Настройка переменных окружения (для версий, отличных от openjdk-11):

    Путь к установленному jdk можно узнать с помощью команды (например, путь /usr/lib/jvm/java-17-openjdk-amd64):

    readlink -f $(which java)
    

    Указанную ниже строку с путем необходимо добавить в конец файла ~/.bashrc:

    export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 # задание переменной JAVA_HOME
    export PATH=$JAVA_HOME/bin:$PATH # обновление переменной пути
    

    Для применения изменений необходимо выполнить команду:

    source ~/.bashrc
    

Пункт 3#

  • Проверить установку Maven (выведется информация о maven и версии JDK):

mvn -v

Пункт 4#

  • Создать директорию и выполнить создание проекта c архетипом maven-archetype-quickstart командой:

mvn archetype:generate -DgroupId=com.example -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false

Пункт 5#

  • Изменить файл pom.xml, добавив в проект настройку компилятора (раздел <properties>) и плагин для создания JAR (раздел <build>):

<properties>                    <!-- Задание версии компилятора Java 17-->
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

<build>                    <!-- Плагин для создания исполняемого JAR файла-->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.example.App</mainClass> <!-- Замените на главный класс -->
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

Пункт 6#

  • Сборка, создание локального репозитория и запуск проекта:

mvn clean install exec:java -Dexec.mainClass="com.example.App"

Пункт 7#

  • После сборки в каталоге target будет создан jar файл приложения, запустить который можно командой:

java -jar target/myapp*.jar

После запуска должна вывестись приветственная строка «Hello World!».

Объяснение кода#

Структура проекта myapp:

myapp/
├── src/                         # Директория исходного кода и тестов  ├── main/java/com/example/    # Директория исходного кода     └── App.java              # Содержит точку входа приложения - метод main  └── test/java/com/example/    # Директория тестов      └── AppTest.java          # Тесты для класса App.java
├── target/                      # Директория собранных артефактов  ├── classes/                  # Содержит скомпилированные классы из src/main/java/  └── maven-compiler-plugin/compile/default-compile/
│      ├── createdFiles.lst      # Список собранных файлов (JAR/WAR)      └── inputedFiles.lst      # Список исходных файлов для сборки
└── pom.xml                      # Файл проекта

Файл App.java с комментариями:

// Принадлежность файла к пакету com.example, используемого как шаблонный пример в учебных материалах
package com.example;

public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" ); // Вывод строки
    }
}

Файл AppTest.java с комментариями:

// Задание пространства имен
package com.example;

// Импорт необходимых библиотек для тестирования
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * Unit тесты приложения myapp.
 */
public class AppTest
    extends TestCase
{
    /**
     * Создание теста
     *
     * параметр testName задает имя теста
     */
    public AppTest( String testName )
    {
        super( testName );
    }

    /**
     * Метод, который создает и возвращает набор тестов для заданного класса
     */
    public static Test suite()
    {
        return new TestSuite( AppTest.class );
    }

    /**
     * Пустой успешный тест. Используется для проверки, что среда тестирования настроена правильно.
     */
    public void testApp()
    {
        assertTrue( true );
    }
}

Файл pom.xml содержит описание проекта, включая информацию о фреймворках, зависимостях, задачах сборки и других метаданных, которые нужны для сборки и публикации проекта:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">   «<! —» используемая схема «->»
  <modelVersion>4.0.0</modelVersion>      «<! —» версия модели maven «->»
  <groupId>com.example</groupId>        «<! —» идентификатор компании, где разработан проект «->»
  <artifactId>myapp</artifactId>        «<! —» имя создаваемого артефакта «->»
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>       «<! —» версия создаваемого артефакта «->»

  <properties>                    <!-- Задание версии компилятора Java 17-->
      <maven.compiler.source>17</maven.compiler.source>
      <maven.compiler.target>17</maven.compiler.target>
  </properties>

  <build>                      <!-- Плагин для создания исполняемого JAR файла-->
      ...                      <!-- Полное описание представлено выше-->
  </build>


  <name>myapp</name>                        «<! —» имя проекта «->»
  <url>http://maven.apache.org</url>        «<! —» URL проекта «->»
  <dependencies>                            «<! —» зависимости проекта «->»
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>       «<! —» библиотека JUnit - фреймворк для тестирования «->»
      <version>3.8.1</version>             «<! —» версия JUnit «->»
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Создание приложения с Maven в IDE#

Интеграция Maven в IDE значительно упрощает разработку, поскольку предоставляет удобный интерфейс для работы с pom.xml (есть анализ зависимостей и конфликтов, поддержка транзитивных зависимостей и другое).

Создание проекта с Maven в OpenIDE:

  • В меню выбрать File -> New -> Project -> Java -> Maven и выбрать Add sample code.

  • Запуск проекта по кнопке Run.

Gradle#

Gradle — более современный инструмент, основанный на DSL (Domain Specific Language) на Groovy или Kotlin. Это позволяет разработчикам более гибко настраивать сборку проектов, чем в Maven. В Gradle файл конфигурации называется build.gradle и содержит все необходимые настройки для проекта.

Gradle использует концепцию «зависимостей» и «тасков» (задач), которые можно комбинировать для достижения желаемого результата. Gradle использует кэширование, поэтому он часто быстрее, чем Maven при повторных сборках.

Базовые команды Gradle#

Gradle предоставляет множество команд для управления проектом. Основные задачи:

  • gradle build — для полной сборки проекта, включая компиляцию, тестирование и упаковку.

  • gradle clean — для очистки всех сгенерированных файлов и директорий.

  • gradle run — для запуска приложения (требуется плагин application).

Пример других команд для выполнения специфических задач:

  • gradle test — для запуска тестов.

  • gradle assemble — для сборки артефактов без запуска тестов.

Список всех команд:

gradle tasks

Создание приложения (Gradle без IDE)#

Пункт 1#

  • Установить пакеты JDK (например, OpenJDK) и Gradle:

sudo apt install openjdk-17-jdk
sudo apt install gradle

Пункт 2#

  • Настройка переменных окружения (для версий, отличных от openjdk-11):

    Путь к установленному jdk можно узнать с помощью команды (например, путь /usr/lib/jvm/java-17-openjdk-amd64):

    readlink -f $(which java)
    

    Указанную ниже строку с путем необходимо добавить в конец файла ~/.bashrc:

    export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 # задание переменной JAVA_HOME
    export PATH=$JAVA_HOME/bin:$PATH # обновление переменной пути
    

    Для применения изменений необходимо выполнить команду:

    source ~/.bashrc
    

Пункт 3#

  • Проверить установку Gradle (выведется информация о gradle и версии JDK):

gradle -v

Пункт 4#

  • Создать директорию myappls, перейти в нее и выполнить создание java-проекта:

gradle init --type java-application

В результате будет создан проект следующей структуры:

myapp/
├── gradle/                             # Файлы конфигурации gradle  └── wrapper/
│      ├── gradle-wrapper.jar           # Исполняемый JAR-файл, отвечающий за загрузку и запуск Gradle      └── gradle-wrapper.properties    # Параметры (в т.ч. URL загрузки Gradle)
├── src/                                # Директория исходного кода  └── main/java/org.example/Main.java  # Файл главного класса, содержит точку входа приложения - метод main
├── gradlew                             # Скрипт запуска Gradle для Linux, управляющий проектом
├── gradlew.bat                         # Скрипт запуска Gradle для Windows, управляющий проектом
├── settings.gradle                     # Файл конфигурации, определяет, как обрабатывать проект и какие модули присутствуют
└── build.gradle                        # Основной файл конфигурации, описывает зависимости проекта, плагины, задачи сборки и другое

Папка build создастся при сборке проекта (например, после выполнения команды gradle build) и будет содержать сгенерированные файлы (скомпилированные *.class-файлы, jar-файлы, скрипты запуска *.sh и *.bat и др.).

Пункт 5#

  • Сборка и запуск приложения:

gradle run
  • Публикация приложения:

gradle jar

Пункт 6#

  • После публикации в каталоге build/libs будет создан jar файл приложения, запустить который можно командой:

java -jar build/libs/myapp*.jar

После запуска должна вывестись приветственная строка «Hello World!».

Объяснение кода#

  • Файл build.gradle с комментариями:

// Плагин поддержки языка Java
// Добавляет стандартные задачи  (compileJava, compileTestJava, test, jar - появится в build/libs)
apply plugin: 'java'

// Плагин сборки приложений
// Добавляет стандартные задачи  (run - запуск метода main() из основного класса, startScripts - генерация скриптов запуска приложения *.bat и *.sh , distZip/distTar - создание zip/tar)
apply plugin: 'application'

// Общие задачи Gradle (clean, build, assemble)

// Задание путей подключаемых зависимостей проекта
repositories {
    // Подключение популярного хранилища Java-библиотек
    jcenter()
}

// Указание библиотек и их версионности
dependencies {
    // Библиотека Guava (работа с I/O, строками и др.)
    compile 'com.google.guava:guava:23.0'

    // Фреймворк для тестов JUnit
    testCompile 'junit:junit:4.12'
}

// Задание главного класса приложения
mainClassName = 'App'
  • Файл App.java:

public class App {
    public String getGreeting() {
        return "Hello world.";
    }

    // Обязательно наличие метода main в основном классе
    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}
  • Файл AppTest.java:

//Подключение библиотек Unit тестирования
import org.junit.Test;
import static org.junit.Assert.*;

public class AppTest {
    @Test public void testAppHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull("app should have a greeting", classUnderTest.getGreeting());
    }
}

Создание приложения с Gradle в IDE#

Интеграция Gradle в IDE значительно упрощает разработку, поскольку предоставляет удобный интерфейс для работы с build.gradle (есть анализ зависимостей и конфликтов, поддержка транзитивных зависимостей и другое).

Создание проекта с Gradle в OpenIDE:

  • В меню выбрать File -> New -> Project -> Java -> Gradle и выбрать Add sample code.

  • Запуск проекта по кнопке Run.

Добавление пакетов#

Ниже представлены 3 варианта установки дополнительных пакетов для разработки в Java (на примере пакета JDBC — библиотека для подключения к реляционным базам данных).

Установка пакета без систем управления#

Пункт 1#

Скачать соответствующий JAR-файл драйвера:

Пункт 2#

Добавить загруженный JAR-файл в classpath при сборке и запуске приложения:

javac -cp ".;path/to/jdbc-driver.jar" YourApp.java
java -cp ".;path/to/jdbc-driver.jar" YourApp

Установка пакета в Maven#

Добавить зависимость в файл pom.xml:

 <!-- Базовый JDBC API -->
 <dependency>
     <groupId>javax.sql</groupId>
     <artifactId>jdbc-stdext</artifactId>
     <version>2.0</version>
 </dependency>

<!-- Драйвер для PostgreSQL -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.6.0</version>
</dependency>

<!-- Драйвер для MySQL -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.33</version>
</dependency>

<!-- Драйвер для MS SQL Server -->
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>12.4.1.jre11</version>
</dependency>

<!-- Драйвер для Oracle Database -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc11</artifactId>
    <version>21.9.0.0</version>
</dependency>

При выполнении команды происходит автоматическая проверка совместимости устанавливаемого пакета с проектом. После требуется обновить зависимости проекта:

mvn dependency:resolve

Установка пакета в Gradle#

Добавить зависимость в файл build.gradle:

dependencies {
    // Базовый JDBC API
    implementation 'javax.sql:jdbc-stdext:2.0'

    // Драйвер MySQL
    implementation 'mysql:mysql-connector-java:8.0.33'

    // Драйвер для PostgreSQL
    // implementation 'org.postgresql:postgresql:42.6.0'

    // Драйвер для Oracle Database
    // implementation 'com.oracle.database.jdbc:ojdbc11:21.9.0.0'

    // Драйвер для MS SQL Server
    // implementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.1.jre11'
}

При выполнении команды происходит автоматическая проверка совместимости устанавливаемого пакета с проектом. После требуется обновить зависимости проекта:

gradle dependencies --refresh-dependencies