Есть приложение Javafx, запускается там, разумеется, где есть jre. Можно ли как сделать, чтобы jar файл запускался на компьютерах без установленного JRE? Может быть как-то внедрить внутрь?
4 Answers
Если вы работаете в IntellijIDEA, можете воспользоваться встроенным механизмом генерации автономных файлов
- Cоздайте артефакт:
File -> Project Structure -> Project Settinfs -> Artifacts -> + ->javaFX Application -> From module 'Your Module Name'
Справа во вкладке JavaFX задайте:
Application Class: ваш класс с точкой входа - методом main
Native Bondle: All
Проверьте, что Output directory задана правильно (по умолчанию в папку out\artifacts вашего проекта)
- Сбилдите артефакт:
Build -> Build Artifacts -> 'Ваш артифакт' -> Build
В out/artifacts/ появится директория с исполняемым файлом ваш артефакт.exe и необходимой средой исполнения.
Скопировав папку на дугой компьютер вы можете запустить проект без установленной JRE, т.к. все что нужно находится в одной папке с исполняемым файлом.
- 3,011
Это возможно.
Есть специальные программы, которые компилируют ваш код заранее (AOT компиляция) и оборачивают его в исполняемый файл вашей ос, который вдобавок содержит портативную JRE.
Знаю одну такую, называется Excelsior JET, правда не юзал её с приложениями javafx, но со стандартной библиотекой и swing работает нормально.
- 790
-
Шикарная вещь. Благодарю. С JavaFX работает замечательно, даже различные модули упаковывает отдельно, хотя и только с 8 джавой работает. И еще очень странное поведение, что нельзя собрать исполняемый файл для каждой ОС под одной ОС. Или все же можно и я глупый? – Serhii Dikobrazko Nov 26 '18 at 09:15
-
С этим я не могу помочь, сам имею 10.5 минут опыта с программой, не говоря уже о кросс компиляции. – 0x666c Nov 26 '18 at 11:15
Часто используемый способ - это скачать launch4j, натравить его на свой jar-файл и получить исполняемый файл. По сути это самораспаковывающийся архив с запускалкой, JRE и оригинальным файлом внутри, но пользователю это не видно.
Более правильный способ - это использовать jlink:
Структура каталогов простейшего проекта
src
└───com.example
│ module-info.java
│
└───com
└───example
App.java
module-info.java
module com.example { }
App.java
package com.example;
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Команды сборки
javac -d build\mods\com.example src\com.example\module-info.java src\com.example\com\example\App.java
jar --create --file=build\libs\com.example.jar --main-class=com.example.App -C build\mods\com.example .
jlink --module-path build\mods --add-modules com.example --output build\app\example --launcher start=com.example/com.example.App --compress=2 --no-header-files --no-man-pages --strip-debug
В результате в каталоге build\app появится каталог приложения example, который содержит в себе JRE и и саму программу в готовом для распространения виде. Запуск осуществляется с помощью батника - example\bin\start.bat
Естественно, лучше не набирать команды руками, а поручить это сборщику - Maven или Gradle.
- 66,575
-
По поводу jlink не могу ничего сказать, а вот launch4j, как я понимаю, создает все таки просто исполняемый файл без JRE, так как пробовал и все равно возникала ошибка об отсутствии Java. – Сергей Гуков Nov 25 '18 at 11:34
-
@СергейГуков там в настройках был пункт для включения JRE в дистрибутив, на сколько я помню. – Sergey Gornostaev Nov 25 '18 at 11:39
-
Да там есть что-то похожее, но даже указав путь к jre все равно не запускалось. Но возможно просто я неправильно что-то делал – Сергей Гуков Nov 25 '18 at 12:03
-
@SergeyGornostaev спасибо за полезную информацию. протестил launch4J. Там JRE видно будет пользователю, т.к. в папке должен быть сам exe файл и JRE рядом с ним. Если exe-шник попробовать запустить без JRE в директории, то будет ошибка:
"This application was configured to use a bundled Java Runtime Environment but the runtime is missing or corrupted."– invzbl3 Aug 13 '19 at 21:46
Launch4J в действии:
1) Создаете новую папку и забрасываете туда jre и jar файлы:
2) Настраиваете Launch4J в Basic разделе важные поля Output file и jar таким образом:
3) В разделе JRE указываете jre, который в папке:
4) И указываете в Build Wrapper название конфигурационным файлам (после билда можно удалить в случае необходимости):
5) Важный момент: чтобы в результате запустить на любом пк exe файл, он должен находится в одной папке с jre файлом:
Для удобства распространения можно заархивировать jre и exe.
P.s. это конечно не лучшее решение, но также может быть полезным.
- 1,369





fx:deploy. – invzbl3 Aug 11 '19 at 15:46jpackage, как вариант. – invzbl3 Feb 25 '20 at 14:12