[Java] Как запаковать программу в запускаемый .jar файл, Continuous Integration (CI)
Чтобы 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:

Но чтобы при двойном клике на java-программе (.jar который мы соберем) он автоматически запускался - надо чтобы про JVM знала не только IDEA, но и вся операционная система. Самый простой способ это сделать - установить JDK самому:
1) гуглим например “jdk windows”
2) скачиваем windows -> x64 Installer
3) устанавливаем
После этого попробуйте запустите терминал (Win -> cmd -> Command Prompt -> Enter) и проверьте что java (JVM) и javac (java compiler) запускаются (спросим у них их версию например):

Как собрать .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 и взгляните что внутри:

CI: как собирать .jar файл автоматически
Давайте теперь используем Continuous Integration (CI) - GitHub Actions.
Сделаем так чтобы при каждом Commit+Push сервер github автоматически запускал наш .cmd скрипт и делал доступным по ссылке .jar файл - для этого нужно закоммитить .github/workflows/build-jar.yml файл - см. мой коммит с промптом и этим .yml файлом.
Как скачать собранный .jar файл
Откройте CI нажав на зеленую галочку рядом с коммитом:

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