← Назад к вопросам

Что такое Build time?

1.0 Junior🔥 141 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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 включает:

  1. ✓ Компиляцию исходного кода (javac)
  2. ✓ Проверку типов
  3. ✓ Разрешение зависимостей
  4. ✓ Запуск тестов
  5. ✓ Статический анализ
  6. ✓ Упаковку приложения (JAR/WAR)
  7. ✓ Генерирование документации

Все это происходит перед тем как приложение запустится. Ошибки на build time обнаруживаются и исправляются во время разработки, что предотвращает попадание багов в production.