Почему Java Compiler входит в состав JDK?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Почему 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 потому что:
- JDK предназначен специально для разработки
- Разработчикам нужна возможность компилировать код локально
- Компилятор тесно интегрирован с JVM и библиотеками
- IDE и build tools полагаются на javac
- Это гарантирует стандартизацию и совместимость
Javac НЕ входит в JRE потому что:
- JRE предназначена для конечных пользователей (только запуск)
- Это снижает размер дистрибутива
- Не все нужны инструменты разработки на production