Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что является результатом сборки (Building)
Процесс сборки (Building) в Java — это трансформация исходного кода в исполняемый артефакт. Результат сборки зависит от типа проекта и конфигурации, но основные артефакты одинаковы для всех Java приложений.
Основные результаты сборки
1. Скомпилированный байтекод (.class файлы)
Главный результат сборки — это скомпилированные Java файлы в формате .class:
// Исходный код: Person.java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
}
После компиляции создаётся файл Person.class, содержащий:**
- Байтекод JVM инструкции
- Метаинформация о классе
- Информация о методах и полях
- Таблицы символов
Это промежуточный формат между исходным кодом и исполнением, который может быть выполнен на любой JVM.
2. JAR файл (Java Archive)
Для распространения приложений или библиотек компилированные .class файлы упаковываются в JAR (Java Archive) файл:
# Структура JAR файла
my-app.jar
├── META-INF/
│ ├── MANIFEST.MF # Метаданные проекта
│ └── maven/ # Maven-specific metadata
├── com/example/
│ ├── Person.class
│ ├── service/
│ │ └── PersonService.class
│ └── Main.class
├── resources/
│ ├── application.properties
│ └── config.xml
└── lib/ # Зависимости (внутри fat JAR)
└── dependency.jar
Примеры JAR файлов:
- Application JAR — исполняемое приложение
- Library JAR — библиотека для использования в других проектах
- Fat/Uber JAR — всё в одном файле (код + зависимости)
- Source JAR — исходный код с расширением
-sources.jar - Javadoc JAR — документация с расширением
-javadoc.jar
3. WAR файл (Web Application Archive)
Для веб-приложений результат сборки — это WAR файл:
# Структура WAR файла
my-app.war
├── META-INF/
│ └── MANIFEST.MF
├── WEB-INF/
│ ├── web.xml # Конфигурация веб-приложения
│ ├── classes/ # Скомпилированные Java классы
│ │ └── com/example/
│ │ └── Controller.class
│ └── lib/ # Зависимости (JAR файлы)
│ ├── spring-core.jar
│ ├── spring-web.jar
│ └── dependency.jar
└── index.jsp # Веб-страницы
└── css/
└── style.css
WAR развёртывается на сервере приложений (Tomcat, Jetty, JBoss).
4. EAR файл (Enterprise Archive)
Для сложных enterprise приложений может быть EAR файл:
# Структура EAR файла
my-enterprise-app.ear
├── META-INF/
│ ├── MANIFEST.MF
│ └── application.xml # Конфигурация EAR
├── app1.war # Веб-модуль
├── app2.war # Другой веб-модуль
└── lib/ # Общие зависимости
└── shared-lib.jar
Процесс сборки в деталях
Этапы сборки (Build Lifecycle)
# Maven lifecycle (например)
1. validate — проверка проекта
2. compile — компиляция исходного кода → .class файлы
3. test — запуск unit тестов
4. package — упаковка в JAR/WAR/EAR
5. install — установка в локальный репозиторий
6. deploy — загрузка на удаленный репозиторий
Пример Maven сборки
# Команда сборки
mvn clean package
# Результаты:
# 1. Компилятор javac преобразует:
# src/main/java/*.java → target/classes/*.class
#
# 2. Ресурсы копируются:
# src/main/resources/* → target/classes/*
#
# 3. Упаковка в JAR:
# target/*.jar (готово к использованию)
Структура распакованного результата сборки
// После сборки типичного Maven проекта
target/
├── classes/ # Скомпилированный код
│ ├── com/example/
│ │ ├── Main.class
│ │ ├── Person.class
│ │ └── service/
│ │ └── PersonService.class
│ └── application.properties # Ресурсы
├── test-classes/ # Скомпилированные тесты
│ └── com/example/
│ └── PersonServiceTest.class
├── my-app.jar # Упакованный артефакт
├── my-app-sources.jar # Исходный код
└── my-app-javadoc.jar # Документация
Содержимое .class файла
// Что находится в файле Person.class:
// 1. Магическое число (0xCAFEBABE)
// 2. Версия Java (major + minor version)
// 3. Constant Pool (таблица констант)
// 4. Информация о классе (флаги, родитель, интерфейсы)
// 5. Поля (fields) с метаданными
// 6. Методы (methods) с байтекодом инструкциями
// 7. Атрибуты (attributes)
// 8. Таблица символов
// Пример байтекода (из javap -c Person.class):
// public java.lang.String getName();
// 0: aload_0 // Загрузить this в стек
// 1: getfield // Получить поле name
// 4: areturn // Вернуть результат
Дополнительные артефакты сборки
Metadata (Метаданные)
В META-INF/MANIFEST.MF содержится информация о приложении:
Manifest-Version: 1.0
Created-By: 11.0.15 (OpenJDK)
Main-Class: com.example.Main # Точка входа для запуска
Class-Path: lib/dependency.jar # Путь к зависимостям
Implementation-Title: my-app
Implementation-Version: 1.0.0
Build-Jdk: 11.0.15
Модули (Java 9+)
Если используется модульная система:
# Файл module-info.class содержит описание модуля
module-info.class содержит:
- Имя модуля
- Требуемые модули
- Экспортируемые пакеты
- Предоставляемые сервисы
Использование результатов сборки
Исполнение приложения
# Исполнение JAR файла
java -jar my-app.jar
# С параметрами
java -Xmx1g -jar my-app.jar --arg1=value1
# Исполнение конкретного класса
java -cp target/classes com.example.Main
Использование библиотеки
<!-- pom.xml -->
<dependency>
<groupId>com.example</groupId>
<artifactId>my-library</artifactId>
<version>1.0.0</version>
</dependency>
Spring Boot специфика
Для Spring Boot приложений результат может быть:fat JAR (всё в одном):
mvn clean package
# Результат: my-app-1.0.0.jar (100+ MB)
# Содержит:
# - скомпилированный код
# - все зависимости
# - встроенный Tomcat сервер
# - конфигурационные файлы
# Исполнение:
java -jar my-app-1.0.0.jar
Gradle специфика
# Gradle сборка
./gradlew build
# Результаты в build/ директории
build/
├── classes/java/main/*.class
├── resources/main/*
├── libs/my-app.jar
└── reports/
└── tests/
Заключение
Результаты сборки Java проекта:
- Скомпилированный байтекод (.class файлы) — основной артефакт
- JAR файл — упакованное приложение или библиотека
- WAR файл — веб-приложение для сервера
- EAR файл — enterprise приложение
- Метаданные (MANIFEST.MF) — конфигурация артефакта
- POM/Gradle metadata — информация о сборке
Эти артефакты могут быть распространены, установлены как зависимости, развёрнуты на серверы или исполнены напрямую.