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 с расширенным набором доступных классов и средства разработки).
Пакет |
Версия |
Репозиторий |
Описание |
---|---|---|---|
openjdk-17-jdk |
17.0.13+11-2~deb12u1 |
extended |
Комплект разработки ПО на Java |
21.0.7+9 |
Axiom JDK |
Дистрибутив для запуска, компиляции и отладки приложений |
|
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) |
21.0.5+9-b1 |
Axiom JDK |
IDE для разработки (рекомендуемое) |
|
4.25.0 |
eclipse |
IDE для разработки |
|
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 фаз построения приложения, выполняющихся последовательно:
clean — удаляются все скомпилированные файлы из каталога target (место, в котором сохраняются готовые артефакты);
validate — идет проверка, вся ли информация доступна для сборки проекта;
compile — компилируются файлы с исходным кодом;
test — запускаются тесты;
package — упаковываются скомпилированные файлы (в jar и др. архивы);
verify — выполняются проверки для подтверждения готовности упакованного файла;
install — пакет помещается в локальный репозиторий. Теперь он может использоваться другими проектами как внешняя библиотека;
site — создается документация проекта;
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