W3docs

Как скомпилировать и запустить программу на Java

Используйте javac для компиляции .java-файлов в байткод .class и запускайте программы на JVM с помощью команды java.

Программа на Java проходит два этапа перед тем, как выдать результат. Сначала компилятор превращает ваши .java-файлы с исходным кодом в платформонезависимый байткод (файлы .class). Затем JVM загружает этот байткод и выполняет его. Понимание обоих этапов позволяет разобраться с ошибками classpath, упаковкой и теми странными краевыми случаями, которые порой встречаются.

В этой главе мы разберём цепочку инструментов — javac, java и jshell — а также ожидаемую структуру файлов.

Цепочка инструментов

При установке JDK вы получаете три команды, которые будете использовать постоянно:

  • javac — компилятор Java. Принимает .java-файлы с исходным кодом и создаёт файлы .class.
  • java — лаунчер. Загружает JVM, находит класс по имени и запускает его метод main.
  • jshell — интерактивный REPL (цикл чтения-вычисления-вывода) для проверки фрагментов кода без написания полноценной программы. Добавлен в Java 9.

Убедиться в их доступности можно, запустив каждую команду с флагом -version:

javac -version
java -version
jshell --version

Компиляция одного файла с исходным кодом

Предположим, у вас есть файл Greeting.java:

public class Greeting {
    public static void main(String[] args) {
        System.out.println("Hello from javac!");
    }
}

Скомпилируйте его:

javac Greeting.java

Если ошибок нет, в той же директории появится новый файл Greeting.class. Это и есть байткод. Запустите его:

java Greeting
Hello from javac!

Обратите внимание: передаётся имя класса, а не имя файла. java Greeting.class — неверно, как и java Greeting.java.

Компиляция программы с пакетами

Реальные программы организованы в пакеты, которые соответствуют структуре директорий. Класс, объявленный как package com.example.greet;, должен находиться в com/example/greet/.

project/
└── src/
    └── com/example/greet/
        └── Greeting.java
// src/com/example/greet/Greeting.java
package com.example.greet;

public class Greeting {
    public static void main(String[] args) {
        System.out.println("Hello with packages!");
    }
}

Из директории project/ скомпилируйте и запустите, используя полностью квалифицированное имя класса:

javac -d out src/com/example/greet/Greeting.java
java -cp out com.example.greet.Greeting
  • -d out указывает javac помещать сгенерированные файлы .class в директорию out/ (воссоздавая структуру директорий пакета).
  • -cp out указывает java искать классы в classpath out/.
  • com.example.greet.Greeting — полностью квалифицированное имя класса: пакет, точка и класс.

На практике для этого используют инструменты сборки (Maven или Gradle, которые рассматриваются позже в книге). Но понимание того, что происходит «под капотом», очень помогает при отладке.

Режим одного файла

Начиная с Java 11 для однофайловых программ можно вовсе не использовать javac:

java Greeting.java

Лаунчер компилирует код в памяти и сразу запускает результат — файл .class на диск не записывается. Это отличный вариант для быстрых скриптов и упражнений из книги.

Примечание

Source-file mode only works when the program fits in a single .java file. The moment you split your code across two source files, switch back to javac (or a build tool) to compile them together.

jshell — интерактивный REPL

jshell позволяет вводить выражения и операторы Java по одной строке, как в Python или Node REPL:

$ jshell
|  Welcome to JShell -- Version 21.0.4
|  For an introduction type: /help intro

jshell> int x = 21
x ==> 21

jshell> int y = 21
y ==> 21

jshell> x + y
$3 ==> 42

jshell> System.out.println("Hello!")
Hello!

jshell> /exit

Не нужно ни класса, ни метода main, ни даже точек с запятой для простых выражений. Это отличный способ изучить стандартную библиотеку без создания проекта.

Запуск из IDE

Каждая Java IDE — IntelliJ, Eclipse, VS Code — вызывает javac и java за кулисами при нажатии Run. IDE также управляет classpath, отображает ошибки компилятора прямо в коде и выводит результат программы в панели консоли. Использовать командную строку необязательно, но понимание того, что делает IDE, значительно ускоряет отладку проблем со сборкой.

Живой пример

Блок ниже проходит тот же цикл javac → java на нашем сервере каждый раз при нажатии Run:

java— editable, runs on the server

Отредактируйте код, нажмите Run, и сервер скомпилирует изменённый исходный код и выведет результат работы программы.

Распространённые ошибки компиляции

Несколько часто встречающихся ошибок:

  • class Greeting is public, should be declared in a file named Greeting.java — имя файла и имя публичного класса должны совпадать точно.
  • error: cannot find symbol — как правило, опечатка, отсутствующий import или класс, которого нет в classpath.
  • ';' expected — отсутствует точка с запятой в конце оператора.
  • error: package x.y.z does not exist — директория пакета не включена в classpath, или javac указывает не на тот корень исходников.

При возникновении сомнений читайте сообщение об ошибке — диагностические сообщения javac отличаются особой ясностью.

Что дальше

Освоив инструментарий, вы готовы к следующей части книги, посвящённой самому языку: Переменные Java, Типы данных и остальные основы синтаксиса.

Практика

Практика
Какая команда компилирует Greeting.java в байткод?
Какая команда компилирует Greeting.java в байткод?
Was this page helpful?