Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Build Time — время сборки приложения
Build time (время сборки) — это период, когда разработчик или автоматизированная система компилирует исходный код в готовое к запуску приложение. Это различается от runtime (время выполнения), когда приложение уже работает.
Build Time vs Runtime
// COMPILE TIME (Build time)
// Происходит во время разработки и сборки:
// 1. javac компилирует .java в .class
// 2. Maven/Gradle собирает JAR файл
// 3. Проверяются зависимости
// 4. Запускаются unit тесты
// RUNTIME (время выполнения)
// Происходит когда приложение уже запущено:
java -jar myapp.jar // JVM запускает приложение
// Приложение выполняется и обрабатывает данные
Этапы Build Time
1. Компиляция исходного кода
Компилятор javac преобразует .java файлы в .class (байт-код):
// Исходный файл: Main.java
public class Main {
public void printMessage(String msg) {
System.out.println(msg);
}
}
// Команда: javac Main.java
// Результат: Main.class (байт-код для JVM)
2. Проверка типов
Компилятор проверяет типы и их совместимость только на build time:
// COMPILE TIME CHECK — обнаруживается при компиляции
String text = "hello";
int number = text; // ❌ Compile Error: incompatible types
List<String> names = new ArrayList<>();
names.add("Alice");
names.add(123); // ❌ Compile Error: required String, found int
Это называется static typing — ошибки типов обнаруживаются до запуска.
3. Разрешение зависимостей
Build система (Maven/Gradle) загружает зависимости из репозиториев:
// pom.xml (Maven)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.0</version>
</dependency>
// Команда: mvn clean install
// Build time: загружаются все зависимости из Maven Central
// Результат: все JAR файлы скачаны в ~/.m2/repository
4. Запуск тестов
// Unit тесты выполняются на build time
// mvn test
@Test
public void testAddition() {
Calculator calc = new Calculator();
assertEquals(4, calc.add(2, 2));
}
// Если тест падает, сборка прерывается
// Приложение не будет упаковано в JAR
5. Статический анализ кода
Линтеры и анализаторы проверяют код на качество:
// Build time анализ
mvn clean compile && mvn spotbugs:check
// Проверяет:
// - Код никогда не используется
// - Возможные null pointer exceptions
// - Потенциальные security проблемы
// - Нарушения style guidelines
6. Упаковка (Packaging)
Создается готовое к запуску приложение (JAR, WAR, etc.):
// Команда: mvn package
// Результат: target/myapp-1.0.0.jar
// Структура JAR файла:
myapp-1.0.0.jar
├── META-INF/
│ ├── MANIFEST.MF
│ └── maven/...
├── com/
│ └── example/
│ └── Main.class
└── lib/ (зависимости)
├── spring-core-5.3.0.jar
├── spring-beans-5.3.0.jar
└── ...
Build Time операции в Java
Аннотации и Annotation Processing
// Build time: обработка аннотаций
import java.lang.annotation.*;
@Retention(RetentionPolicy.SOURCE) // Только на compile time
@Target(ElementType.METHOD)
public @interface Deprecated {
String value() default "";
}
public class Example {
@Deprecated("Use newMethod() instead")
public void oldMethod() {
// Компилятор выдаст warning, но код скомпилируется
}
public void newMethod() {
// Новая версия
}
}
// Build time: lombok обрабатывает аннотации и генерирует код
@Getter
@Setter
public class Person {
private String name;
private int age;
// Lombok генерирует getter/setter во время компиляции
}
Условная компиляция
// Некоторые части кода компилируются только при определённых условиях
public class Debug {
public static final boolean DEBUG = true; // Build time constant
public static void log(String msg) {
if (DEBUG) {
System.out.println(msg);
}
// Если DEBUG = false, мёртвый код будет оптимизирован JIT
}
}
Build Time в Maven
// Полный цикл maven build
mvn clean install
// Фазы выполняются последовательно:
1. clean
- Удаляется директория target/
2. validate
- Проверка структуры проекта
- Проверка pom.xml
3. compile
- javac компилирует src/main/java в target/classes
- Результат: .class файлы
4. test
- Компиляция src/test/java
- Запуск JUnit тестов
- Если тесты падают — сборка прерывается
5. package
- Создание JAR/WAR файла
- target/myapp-1.0.0.jar
6. verify
- Проверка качества (SonarQube, SpotBugs)
7. install
- Копирование артефакта в локальный репозиторий (~/.m2/repository)
8. deploy
- Загрузка в удаленный репозиторий (Nexus, Artifactory)
Build Time vs Runtime: Практические различия
// COMPILE TIME (Build time) — известно СТАТИЧЕСКИ
public class BuildTimeExample {
// 1. Проверка типов
int x = "string"; // ❌ Compile error
// 2. Проверка синтаксиса
int y = 5
// Missing semicolon -> ❌ Compile error
// 3. Проверка наличия методов
String s = "hello";
s.nonExistentMethod(); // ❌ Compile error
}
// RUNTIME (время выполнения) — известно ДИНАМИЧЕСКИ
public class RuntimeExample {
public static void main(String[] args) {
String text = null;
System.out.println(text.length());
// ✓ Компилируется успешно!
// ❌ Но при запуске: NullPointerException
int[] arr = new int[5];
System.out.println(arr[10]);
// ✓ Компилируется успешно!
// ❌ Но при запуске: ArrayIndexOutOfBoundsException
}
}
Оптимизация Build Time
// 1. Параллельная компиляция
mvn -T 1C clean install
// -T 1C = использовать 1 поток на ядро CPU
// 2. Использование кеша зависимостей
mvn clean install -o // offline mode
// 3. Скипование тестов при разработке
mvn clean install -DskipTests
// Но обязательно запустить их перед commit!
// 4. Инкрементальная компиляция
// Компилировать только изменённые файлы
gradle build --build-cache
// 5. Multi-module проекты
// Компилировать только затронутые модули
mvn -pl module1,module2 clean install
Build Time в различных контекстах
// 1. Local Development
// Build time: 30-60 секунд
mvn clean install
// 2. CI/CD Pipeline (GitHub Actions, Jenkins)
// Build time: 2-5 минут (включая тесты)
// Может быть медленнее из-за проверок quality
// 3. Docker контейнер
// Build time: multi-stage build
FROM maven:3.8-jdk-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package
FROM openjdk:17-slim
COPY --from=builder /build/target/app.jar .
ENTRYPOINT ["java", "-jar", "app.jar"]
// Build time на Docker: может быть 5-10 минут
// Зато исходный код не попадает в финальный образ
Build Time артефакты
Что создается во время build time:
target/
├── classes/ // Скомпилированные .class файлы
├── test-classes/ // Скомпилированные тесты
├── myapp-1.0.0.jar // Упакованное приложение
├── myapp-1.0.0-sources.jar // Исходные коды
├── myapp-1.0.0-javadoc.jar // Документация
├── surefire-reports/ // Отчёты о тестах
├── coverage/ // Coverage отчёты
└── site/ // HTML отчёты
Итог
Build time включает:
- ✓ Компиляцию исходного кода (javac)
- ✓ Проверку типов
- ✓ Разрешение зависимостей
- ✓ Запуск тестов
- ✓ Статический анализ
- ✓ Упаковку приложения (JAR/WAR)
- ✓ Генерирование документации
Все это происходит перед тем как приложение запустится. Ошибки на build time обнаруживаются и исправляются во время разработки, что предотвращает попадание багов в production.