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

Какой командой компилируется программа на Java?

1.0 Junior🔥 221 комментариев
#Основы Java

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

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

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

Компиляция Java программ

Основная команда: javac

Для компиляции Java программ используется команда javac (Java Compiler). Это инструмент из Java Development Kit (JDK), который преобразует исходный код .java файлов в скомпилированный байт-код .class.

Базовый синтаксис

javac ИмяФайла.java

Эта команда компилирует файл и создаёт файл ИмяФайла.class:

# Файл до компиляции
HelloWorld.java

# После компиляции
HelloWorld.class

Пример простой программы

// HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
# Компиляция
javac HelloWorld.java

# Запуск
java HelloWorld

Компиляция нескольких файлов

# Все .java файлы в текущей директории
javac *.java

# Конкретные файлы
javac File1.java File2.java File3.java

# Все файлы в папке
javac src/*.java

# Рекурсивно все файлы
javac -r src/

Важные флаги javac

# -d: Директория для output .class файлов
javac -d bin/ src/HelloWorld.java
# Создаст bin/HelloWorld.class

# -cp или -classpath: Путь к зависимостям
javac -cp lib/library.jar src/Main.java

# -sourcepath: Где искать исходные файлы
javac -sourcepath src/ -d bin/ src/Main.java

# -version: Целевая версия Java
javac -source 11 -target 11 HelloWorld.java

# -encoding: Кодировка исходных файлов
javac -encoding UTF-8 HelloWorld.java

# -deprecation: Показывать предупреждения о deprecated коде
javac -deprecation HelloWorld.java

# -Xlint: Дополнительные предупреждения
javac -Xlint HelloWorld.java

Пример с package структурой

# Структура проекта
project/
├── src/
│   └── com/example/
│       ├── Main.java
│       └── Utils.java
└── bin/

# Компиляция
javac -d bin/ src/com/example/*.java

# Результат
bin/
└── com/example/
    ├── Main.class
    └── Utils.class

Классический workflow: javac + java

# Структура проекта
my-app/
├── src/
│   └── Calculator.java
└── bin/

# Шаг 1: Компилируем
cd my-app
javac -d bin/ src/Calculator.java

# Шаг 2: Запускаем
java -cp bin/ Calculator

С внешними зависимостями

# Компиляция с библиотеками
javac -cp lib/json.jar:lib/database.jar -d bin/ src/Main.java

# На Windows (используй ; вместо :)
javac -cp lib\\json.jar;lib\\database.jar -d bin/ src/Main.java

Maven и Gradle (современный подход)

В production разработке используют build tools, которые автоматизируют компиляцию:

# Maven
mvn compile      # Компилирует всё
mvn clean        # Удаляет target/

# Gradle
./gradlew build  # Компилирует и упаковывает
./gradlew compileJava

pom.xml для Maven:

<project>
    <name>My App</name>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.9</version>
        </dependency>
    </dependencies>
    <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>
</project>

Что происходит при компиляции

Компилятор javac выполняет несколько этапов:

1. Лексический анализ — разделить исходный код на токены
   HelloWorld.java → ["public", "class", "HelloWorld", ...]

2. Синтаксический анализ — проверить грамматику языка
   Проверяет, что { и } совпадают, что методы определены правильно

3. Семантический анализ — проверить типы и ссылки
   System.out.println() — существует ли такой метод?
   String s = 123; — ошибка типа!

4. Генерация bytecode — создание .class файла
   Java bytecode — промежуточное представление (не машинный код)

5. Оптимизация (опционально) — улучшение bytecode

Bytecode и JVM

После компиляции получается bytecode — специальный язык для JVM:

// Java код
int x = 5;
int y = 3;
int result = x + y;

// Becomes bytecode:
LDC 5
ISTORE 1
LDC 3
ISTORE 2
ILOAD 1
ILOAD 2
IADD
ISTORE 3

Этот bytecode одинаков для всех платформ (Linux, Windows, Mac). JVM интерпретирует его под конкретную платформу.

IDE (IntelliJ IDEA, Eclipse, VS Code)

В современных IDE компиляция происходит автоматически:

  • При сохранении файла
  • При запуске программы
  • При сборке проекта

Tы не видишь команду javac, но IDE вызывает её под капотом.

Проверка версии компилятора

javac -version
# javac 11.0.12

javac -fullversion
# javac 11.0.12 (build 11.0.12+7-post-Ubuntu-0ubuntu1.1)

Типичные ошибки при компиляции

# Ошибка 1: Файл не найден
$ javac NonExistent.java
error: file not found: NonExistent.java

# Ошибка 2: Синтаксис ошибка
$ javac Test.java
Test.java:5: error: ';' expected
    int x = 5

# Ошибка 3: Класс не найден (часто при неправильной package структуре)
error: cannot find symbol
  symbol:   class Utils
  location: class Main

Заключение

Команда для компиляции Java программы:

javac ИмяФайла.java          # Базовая форма
javac -d bin/ src/*.java      # С output директорией
javac -cp lib/lib.jar Main.java  # С зависимостями

В production используются Maven или Gradle, но под капотом они тоже вызывают javac. Понимание базовой компиляции через javac важно для разработчика, но в повседневной работе ты будешь использовать build tools.

Какой командой компилируется программа на Java? | PrepBro