Чтобы Java-проект легче было запускать на любом компьютере (например отправить другу который не занимается программированием) - удобно было бы упаковать проект в самодостаточный запускаемый по двойному клику файл.

В случае Java чаще всего используют .jar файл, который является .zip архивом внутри которого скомпилированные классы (код), все ресурсы (картинки, музыка и т.п. вашего проекта), а так же манифест в котором указано какой класс запускать для начала работы программы (обычно это Main класс с main-функцией).

Обсудим что такое Continuous Integration, который позволит нам бесплатно на GitHub Actions организовать автоматическую сборку проекта в .jar файл после каждого Commit+Push.

Установить Java на уровне операционной системы

Для того чтобы компилировать .java исходники нам нужно JDK (Java Development Kit).

Для того чтобы запускать скомпилированные java-программы нам нужна JVM (Java Virtual Machine), это что-то вроде интерпретатора, благодаря тому что java-программы исполняются на ней - они универсальны и работают на любых операционных системах (windows/linux/macos). Нужно лишь чтобы была установлена виртуальная машина Java (JVM).

JVM является частью JDK.

Вероятно вы уже установили JDK в рамках IDEA - вы можете узнать путь к такой JDK обратив внимание при запуске программы в IDEA на эту строку - это путь к JVM (java.exe) внутри JDK:

Как найти путь к JVM в IDEA

Но чтобы при двойном клике на java-программе (.jar который мы соберем) он автоматически запускался - надо чтобы про JVM знала не только IDEA, но и вся операционная система. Самый простой способ это сделать - установить JDK самому:

1) гуглим например “jdk windows”

2) скачиваем windows -> x64 Installer

3) устанавливаем

После этого попробуйте запустите терминал (Win -> cmd -> Command Prompt -> Enter) и проверьте что java (JVM) и javac (java compiler) запускаются (спросим у них их версию например):

Как проверить что java и javac работают в терминале

Как собрать .jar файл через .cmd скрипт

1) Нужно написать скрипт который будет автоматически компилировать все исходники (.java -> .class), класть рядом с ними картинки, писать рядом манифест (указывающий что Main класс содержит main-функцию), запаковывать все это в .jar файл

2) Обновить код загрузки картинок - он должен быть теперь не через ImageIO.read(new File("data/box.png")); а через Obstacle.class.getResourceAsStream("/data/box.png")

Но чтобы выяснить как это выглядит - можно попросить помочь нейросети, вот мой промпт, скрипт и изменения в коде.

Что такое .jar файл

.jar файл - это просто .zip архив, поэтому переименуйте его расширение сделав так чтобы название файла заканчивалось на .zip и взгляните что внутри:

Пример .jar файла с MANIFEST.MF внутри

CI: как собирать .jar файл автоматически

Давайте теперь используем Continuous Integration (CI) - GitHub Actions.

Сделаем так чтобы при каждом Commit+Push сервер github автоматически запускал наш .cmd скрипт и делал доступным по ссылке .jar файл - для этого нужно закоммитить .github/workflows/build-jar.yml файл - см. мой коммит с промптом и этим .yml файлом.

Как скачать собранный .jar файл

Откройте CI нажав на зеленую галочку рядом с коммитом:

Как открыть CI у commit-а

Теперь скачайте автоматически собранный .jar файл (это удобно например чтобы запустить старую версию - привязанную к старому commit-у):

Как скачать автоматически собранный .jar файл