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, значительно ускоряет отладку проблем со сборкой.

Живой пример

Блок ниже проходит тот же цикл javacjava на нашем сервере каждый раз при нажатии 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?