Как скомпилировать и запустить программу на 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 GreetingHello 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искать классы в classpathout/.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:
Отредактируйте код, нажмите 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, Типы данных и остальные основы синтаксиса.