Как связать JRE с EXE для Java-приложения? Launch4j говорит: "Время выполнения отсутствует или повреждено".
Я новичок в программировании на Java, но я вообще знаком с тем, как все работает. Я хотел бы иметь возможность добавить как файл jar, так и jre в исполняемый файл windows (exe), чтобы при его распространении клиент не должен иметь установленную JRE. Какую программу я должен использовать?
У меня есть launch4j, и он, похоже, делает именно то, что я хочу, но когда я пытаюсь запустить приложение, я получаю: "Это приложение было настроено на использование связанной Java-среды выполнения, но среда выполнения отсутствует или повреждена".
Я хочу, чтобы мое приложение было просто исполняемым exe, а не установщиком. По крайней мере, может ли кто-нибудь показать мне, как правильно связать JRE с launch4j?
Ответы
Ответ 1
Если вам нужен один EXE, проверьте:
HOWTO: Создайте один EXE из своего приложения Java
Примечание.. В приведенной выше статье в основном рассматриваются бесплатные инструменты (7-Zip и ResEdit.) Использование Excelsior JET строго необязательно. Если вам не нужен настоящий собственный код EXE, добавьте частную JRE, и вы достигнете цели, используя только эти бесплатные инструменты.
Ответ 2
Единственный способ связать JRE - использовать Launch4J и компилятор Inno Setup.
Сначала создайте папку jre6
(например) в том же каталоге, что и ваш выходной файл (.exe).
Затем скопируйте JRE из своей системы в папку jre6.
Затем вы открываете Launch4J и устанавливаете пул JRE в комплекте - просто введите jre6
. Затем нажмите кнопку "Создать" (очевидно, после ввода всех других параметров), но единственное значение, которое необходимо ввести на вкладке JRE, - это путь к пулу JRE.)
Я бы ожидал, что это сработает, но если вы затем переместите файл.exe в новое место (так что он больше не находится вместе с вашей папкой jre6), вы получаете это приложение, которое было настроено на использование связанного Java Runtime Environment, но во время выполнения отсутствует или повреждена ошибка при попытке запустить приложение...
Я весь день играл с этим днем, и я не мог заставить Launch4J включить JRE в.exe файл. На самом деле, я считаю, что они бедны, поскольку их документация, похоже, вовсе не ссылается на эту проблему.
Итак, что я сделал, чтобы решить, было использование компилятора Inno Setup (ISC). Это приложение используется для переноса вашего.exe в качестве файла установщика Windows. Поэтому я добавил параметр к сценарию ISC, который копирует JRE в пакет установщика. Строка, которую я добавил в скрипт (в разделе [Files]
), была:
Source: "M:\Netbeans\MyApp\jre6\*"; DestDir: "{app}\jre6\"; Flags: recursesubdirs createallsubdirs
... немного обходного пути, но он сделал трюк.
Повторите все вышеуказанные шаги, и вы должны быть отсортированы.
Ответ 3
Я никогда не использовал продукт Launch4J, удачи в его правильной настройке.
Похоже, вы могли бы пойти на дискуссионный форум по Sourceforge для других советов здесь
Другие предложения:
Большинство продуктов, которые я видел из IBM (Websphere) и Oracle, просто извлекают JRE в каталоге установки и настраивают командную команду запуска для использования установленной JRE. По сути, JRE и ваш файл jar будут установлены одним выстрелом.
Обычно exe установки проверяет, уже ли он установлен, и пропускает этот шаг, если он уже нашел его там. Это полезно для обновления только файла jar.
Наличие локальной установки также решает проблему установки пользователем собственной JRE, которая может быть несовместимой или содержать ошибки. Таким образом, вы имеете дело с известной версией JRE.
Маршрут excelsior в порядке, если у вас нет графического компонента для вашего приложения (это было время, это ограничение, возможно, изменилось). Существуют и другие ограничения, но вы, вероятно, просто лучше просто распределите JRE с кодом в одном исполняемом установщике.
Ответ 4
Кажется, вам нужен собственный компилятор кода. Эти компиляторы производят собственный код, который не требует JRE.
Проверьте эту статью - https://www.excelsior-usa.com/articles/java-to-exe.html#aot.
Ответ 5
Его легко расслоить jre в launch4j..
просто скопируйте jre в ту же папку вывода
В текстовом поле среды jquery bundle просто укажите папку jre
В текстовом поле переменной окружения (представленном на той же странице ниже) дайте, пока bin
Затем создайте exe.. Он работает как ожидалось без jre в машине.
благодаря
Ответ 6
Комплексное решение JRE для установки Inno
Чтобы реализовать связанное решение JRE с приложением jar, я создал скрипт Inno Setup, который:
1) копирует JRE в установочный exe
2) выполняет эквивалент команды терминала: java -jar myjar.jar, используя связанный JRE
Сначала я копирую JRE:
#define MyJREPath "C:\Program Files\Java\jre1.8.0_191"
[Files]
Source: "{#MyJREPath}\*"; DestDir: "{app}\runtime\jre\"; \
Flags: ignoreversion recursesubdirs createallsubdirs;
Я придерживаюсь соглашения о структуре каталогов, показанного здесь: https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html
Чтобы запустить эквивалент java -jar myjar.jar:
[Run]
Filename: "{app}\runtime\jre\bin\javaw.exe"; Parameters: " -jar myjar.jar"; \
WorkingDir: "{app}\app\"; \
Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; \
Flags: postinstall skipifsilent
(nb java.exe работает с терминалом, а javaw.exe работает без терминала)
Ярлык на рабочем столе должен иметь правильное имя файла, параметры и рабочий каталог:
[Icons]
Name: "{commondesktop}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\javaw.exe"; \
Parameters: " -jar myjar.jar"; \
WorkingDir: "{app}\app\"; \
Tasks: desktopicon
[Tasks]
Name: "desktopicon"; \
Description: "{cm:CreateDesktopIcon}"; \
GroupDescription: "{cm:AdditionalIcons}"; \
Flags: unchecked
Для того, чтобы обледенеть торт, чтобы мой сценарий обрабатывал как связанные JRE, так и никакие связанные параметры, я использую инструкцию IF препроцессора (дублируется в каждом разделе сценария), чтобы проверить, имеет ли сценарий пустой MyJREPath или нет. Если MyJREPath не пуст и поэтому требуется комплексное решение JRE, я использую приведенную выше кодировку; в качестве альтернативы, если пакетное решение не требуется, тогда я использую более "нормальное" кодирование, показанное в примерах установки Inno или созданное их мастером. Вот выражение IF:
#if MyJREPath != ""
; bundled JRE required
#else
; bundled JRE not required
#endif
Здесь большая часть моего сценария собрана:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
; some more #defines here
#define MyAppExeName "javaw.exe"
#define MyJREPath "C:\Program Files\Java\jre1.8.0_191"
;#define MyJREPath ""
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId=XXXXXXXXXX
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultGroupName={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyDefaultDirName}
DisableProgramGroupPage=yes
LicenseFile={#MyInnoSetupDir}\system\{#MyLicenseFile}
OutputDir={#MyInnoSetupDir}
#if MyJREPath != ""
; run app with bundled JRE
OutputBaseFilename={#MyAppName}-{#MyAppVersion}-bundledJRE-setup
#else
; run app without bundled JRE
OutputBaseFilename={#MyAppName}-{#MyAppVersion}-setup
#endif
SetupIconFile={#MyInnoSetupDir}\{#MyAppIcoName}
Compression=lzma
SolidCompression=yes
AppComments={#MyAppName}
AppCopyright={#MyAppCopyright}
UninstallDisplayIcon={#MyInnoSetupDir}\{#MyAppIcoName}
UninstallDisplayName={#MyAppName}
WizardImageStretch=No
WizardSmallImageFile={#MyInnoSetupDir}\{#MyAppBmpName}
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
;Name: "german"; MessagesFile: "compiler:Languages\German.isl"
[Tasks]
Name: "desktopicon"; \
Description: "{cm:CreateDesktopIcon}"; \
GroupDescription: "{cm:AdditionalIcons}"; \
Flags: unchecked
Name: "quicklaunchicon"; \
Description: "{cm:CreateQuickLaunchIcon}"; \
GroupDescription: "{cm:AdditionalIcons}"; \
Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
; bundle JRE if required
#if MyJREPath != ""
Source: "{#MyJREPath}\*"; DestDir: "{app}\runtime\jre\"; \
Flags: ignoreversion recursesubdirs createallsubdirs;
#endif
; copy jar and all files
Source: "{#MyInnoSetupDir}\*"; DestDir: "{app}\app\"; \
Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
#if MyJREPath != ""
; set up icons with bundled JRE
Name: "{commonprograms}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; \
Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"
Name: "{commondesktop}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; \
Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; \
Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: quicklaunchicon
#else
; set up icons without bundled JRE
Name: "{commonprograms}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"
Name: "{commondesktop}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: quicklaunchicon
#endif
[Run]
#if MyJREPath != ""
; run app with bundled JRE
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; \
Flags: postinstall skipifsilent
#else
; run app without bundled JRE
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; \
Flags: shellexec postinstall skipifsilent
#endif
Надеюсь это поможет.
Ответ 7
простой способ упаковать jre в exe, который упакован в lanch4j - это использовать wrap.
warp-packer --arch windows-x64 --input_dir mycrt --exec run.bat --output single.exe
и затем остановите cmd windows при запуске exe.
editbin /subsystem:windows
Деформация: https://github.com/dgiagio/warp
editbin: установлен VS
Демо-версия:
![enter image description here]()
![enter image description here]()
Ответ 8
То, о чем вы просите, нелегко сделать (если это вообще возможно). Если бы я был вами, я бы рассмотрел создание исполняемого файла JAR:
java eclipse создать исполняемый банку
Другой вариант - использовать Java Web Start. Предполагалось, что вы используете современный браузер, JNLP автоматически предложит пользователю установить правильную версию Java.
http://docs.oracle.com/javase/tutorial/deployment/webstart/index.html
Ответ 9
Существует несколько причин, по которым start4j не работает нормально. одна из причин:
1) пользователь не запускает приложение в качестве администратора
2) Пользователь неправильно настроил изображение значка. должен строго .ico