Первая программа
Создайте файл Hello.java:
public class Hello { public static void main(String[] args) { System.out.println("Привет, консоль!"); }}Правила:
- имя файла совпадает с именем публичного класса, включая регистр;
- расширение
.java; - точка входа — метод
public static void main(String[] args).
Компиляция и запуск
javac Hello.javajava Hellojavac создает файл Hello.class с байт-кодом. java запускает его по имени класса, без расширения.
Если в консоли Windows вместо кириллицы мусор:
chcp 65001javac -encoding UTF-8 Hello.javajava -Dfile.encoding=UTF-8 HelloЗапуск исходника без компиляции
Начиная с Java 11 одиночный файл можно запустить напрямую:
java Hello.javaJVM скомпилирует его в памяти и сразу выполнит. Удобно для экспериментов.
Передача аргументов
public class Args { public static void main(String[] args) { System.out.println("Аргументов: " + args.length); for (String arg : args) { System.out.println(arg); } }}javac Args.javajava Args один два "три слова"Вывод:
Аргументов: 3одиндватри словаНесколько файлов
Greeter.java:
public class Greeter { public static String greet(String name) { return "Привет, " + name + "!"; }}Main.java:
public class Main { public static void main(String[] args) { System.out.println(Greeter.greet("мир")); }}Компилятор находит зависимости в текущей папке:
javac Main.javajava MainИли все файлы сразу:
javac *.javaПакеты и структура каталогов
Для реальных проектов исходники раскладывают по пакетам. Пакет соответствует папке.
project/├── src/│ └── com/│ └── example/│ └── app/│ ├── Main.java│ └── Greeter.java└── out/src/com/example/app/Greeter.java:
package com.example.app;public class Greeter { public static String greet(String name) { return "Привет, " + name + "!"; }}src/com/example/app/Main.java:
package com.example.app;public class Main { public static void main(String[] args) { System.out.println(Greeter.greet("пакет")); }}Компиляция из корня проекта, результат в out:
javac -d out src/com/example/app/*.javaФлаг -d создает нужные подпапки в out. Запуск — по полному имени класса:
java -cp out com.example.app.MainФлаг -cp (--class-path) говорит JVM, где искать .class-файлы.
Classpath и внешние библиотеки
Если нужна внешняя библиотека в виде .jar:
javac -cp "lib/gson.jar" -d out src/com/example/app/*.javajava -cp "out:lib/gson.jar" com.example.app.MainРазделитель путей: : в Linux и macOS, ; в Windows.
java -cp "out;lib\gson.jar" com.example.app.MainСоздание jar-архива
Упакуйте скомпилированные классы с указанием главного класса:
jar --create --file app.jar --main-class com.example.app.Main -C out .Запуск:
java -jar app.jarСодержимое архива:
jar tf app.jarjshell: интерактивная консоль
jshelljshell> int x = 5x ==> 5jshell> x * 2$2 ==> 10jshell> "abc".toUpperCase()$3 ==> "ABC"jshell> /exitjshell удобен, чтобы быстро проверить выражение или метод стандартной библиотеки.
Полезные флаги javac
| Флаг | Назначение |
|---|---|
-d out | куда класть .class |
-cp | где искать классы и jar |
-encoding UTF-8 | кодировка исходников |
-Xlint:all | все предупреждения |
--release 21 | компилировать под указанную версию |
Типичные ошибки
error: class Main is public, should be declared in a file named Main.java — имя файла не совпадает с именем публичного класса.
Error: Could not find or load main class Main — запуск не из той папки или не указан -cp. Для классов в пакетах используйте полное имя.
Error: Main method not found in class — неверная сигнатура main.
NoClassDefFoundError — при запуске не добавлена библиотека в classpath.
