Можно ли как сделать, чтобы jar файл запускался на компьютерах без установленного JRE? Может быть как-то внедрить внутрь?

127
26 ноября 2020, 02:50

Есть приложение Javafx, запускается там, разумеется, где есть jre. Можно ли как сделать, чтобы jar файл запускался на компьютерах без установленного JRE? Может быть как-то внедрить внутрь?

Answer 1

Если вы работаете в 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, т.к. все что нужно находится в одной папке с исполняемым файлом.

Answer 2

Это возможно.

Есть специальные программы, которые компилируют ваш код заранее (AOT компиляция) и оборачивают его в исполняемый файл вашей ос, который вдобавок содержит портативную JRE.

Знаю одну такую, называется Excelsior JET, правда не юзал её с приложениями javafx, но со стандартной библиотекой и swing работает нормально.

Answer 3

Часто используемый способ - это скачать 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.

Answer 4

Launch4J в действии:

1) Создаете новую папку и забрасываете туда jre и jar файлы:

2) Настраиваете Launch4J в Basic разделе важные поля Output file и jar таким образом:

3) В разделе JRE указываете jre, который в папке:

4) И указываете в Build Wrapper название конфигурационным файлам (после билда можно удалить в случае необходимости):

5) Важный момент: чтобы в результате запустить на любом пк exe файл, он должен находится в одной папке с jre файлом:

Для удобства распространения можно заархивировать jre и exe.

P.s. это конечно не лучшее решение, но также может быть полезным.

READ ALSO
Android studio загрузка контента

Android studio загрузка контента

Есть MainActivity и есть menu_list в android studio, надо, что бы в MainActivity по нажатию на кнопку прогружался контент из menu_list в MainActivityПомогите пожалуйста

122
Прошу разъяснения о работе метода [закрыт]

Прошу разъяснения о работе метода [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

102
RxJava + Retrofit + Observable цикл запросов

RxJava + Retrofit + Observable цикл запросов

Имеется база из которой с помощью запросов достаются данные в формате jsonПервый запрос возвращает массив объектов, в котором есть поле с внешним...

107
ajax.data form.serialize + myaction

ajax.data form.serialize + myaction

Может вопрос глупый, но прошу помочьне могу найти решение

96