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

Почему Java Compiler входит в состав JDK?

1.0 Junior🔥 61 комментариев
#JVM и управление памятью#Основы Java

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

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

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

# Почему Java Compiler входит в состав JDK?

Java Compiler (javac) входит в состав JDK, потому что разработчикам нужна возможность компилировать Java код локально в процессе разработки. Это основной инструмент, необходимый для любого Java разработчика.

Разница между JDK и JRE

JDK (Java Development Kit)
├── JRE (Java Runtime Environment)
│   ├── JVM (Java Virtual Machine)
│   ├── Библиотеки (rt.jar, lib/)
│   └── Утилиты (java, keytool)
├── Compiler (javac) ← ТОЛЬКО в JDK
├── Debugger (jdb)
├── Documentation generator (javadoc)
├── Archive tool (jar)
└── Другие инструменты разработки

JRE содержит только runtime — всё необходимое для запуска скомпилированного Java кода. JDK содержит JRE плюс инструменты разработки, включая компилятор.

Процесс разработки Java

Разработчик пишет код
        ↓
   source.java
        ↓
    javac (компилятор из JDK)
        ↓
   source.class (байткод)
        ↓
    java (виртуальная машина из JRE)
        ↓
   Выполнение программы

Без javac разработчик не может перейти от исходного кода к байткоду, который может запуститься на JVM.

Почему именно javac входит в JDK?

1. Основная цель JDK — разработка

JDK создан специально для разработчиков. Его главная функция — предоставить полный набор инструментов для написания, компилирования, тестирования и отладки Java приложений. Компилятор — это первостепенный инструмент в этом наборе.

// Без javac разработчик не может сделать это:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

// Команда, которую выполняет разработчик
// $ javac HelloWorld.java   ← НУЖЕН КОМПИЛЯТОР
// $ java HelloWorld         ← ЕСТЬ В JRE

2. Локальная разработка

Разработчики работают локально на своих машинах. Им нужна возможность мгновенно компилировать код, видеть ошибки, исправлять их и перекомпилировать. Встроенный javac позволяет это делать.

# Типичный цикл разработки
$ javac App.java      # Компилирование
$ java App            # Тестирование
# (вносим изменения)
$ javac App.java      # Перекомпилирование
$ java App            # Повторное тестирование

3. Взаимная интеграция

javac тесно интегрирован с JVM и стандартной библиотекой Java. Они разрабатываются вместе и должны быть совместимы. Распределение их отдельно усложнило бы версионирование и совместимость.

javac из JDK 11 генерирует байткод, совместимый с JVM из JDK 11
javac из JDK 17 генерирует байткод, совместимый с JVM из JDK 17

4. IDE и Build tools полагаются на javac

Интегрированные среды разработки (IDE) как IntelliJ IDEA и Eclipse используют javac или его производные для компилирования код. Большинство build tools (Maven, Gradle) требуют JDK, а не просто JRE, именно потому что им нужен компилятор.

<!-- Maven требует JDK для компилирования -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
    </plugins>
</build>

5. Стандартизация и воспроизводимость

Если бы компилятор не входил в JDK, разработчики пользовались бы разными компиляторами (ECJ, Kotlin компилятор и т.д.), что привело бы к несовместимостям. Включение javac в JDK гарантирует единообразие.

Где используется javac?

В IDE

IntelliJ IDEA → использует javac для проверки синтаксиса и ошибок
Eclipse → использует ECJ (собственный компилятор на основе javac)
NetBeans → использует javac

В Build tools

Maven → вызывает javac из JDK при mvn compile
Gradle → вызывает javac из JDK при gradle build
Ant → вызывает javac для <javac> таски

В производстве

Compile phase: разработчик с JDK пишет и компилирует код
Deploy phase: в production отправляется только .class файлы и JRE

Почему javac НЕ входит в JRE?

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

Если вы просто устанавливаете Java для запуска application.jar:
→ Нужна JRE (меньше места, меньше нагрузки)

Если вы разработчик, пишущий Java код:
→ Нужен JDK (компилятор, debugger, инструменты)

Пример архитектуры проекта

Разработчик на локальной машине (JDK)
        ↓
    javac компилирует
        ↓
   MyApp.class (байткод)
        ↓
   Отправка на production сервер
        ↓
Production сервер (JRE)
        ↓
   java MyApp запускает байткод
        ↓
   Приложение работает

Заметьте: на production сервере javac не нужен вообще. Туда отправляется только скомпилированный код и JRE.

Вывод

Javac входит в JDK потому что:

  1. JDK предназначен специально для разработки
  2. Разработчикам нужна возможность компилировать код локально
  3. Компилятор тесно интегрирован с JVM и библиотеками
  4. IDE и build tools полагаются на javac
  5. Это гарантирует стандартизацию и совместимость

Javac НЕ входит в JRE потому что:

  1. JRE предназначена для конечных пользователей (только запуск)
  2. Это снижает размер дистрибутива
  3. Не все нужны инструменты разработки на production