Подтвердить что ты не робот

Как связать JRE с EXE для Java-приложения? Launch4j говорит: "Время выполнения отсутствует или повреждено".

Я новичок в программировании на Java, но я вообще знаком с тем, как все работает. Я хотел бы иметь возможность добавить как файл jar, так и jre в исполняемый файл windows (exe), чтобы при его распространении клиент не должен иметь установленную JRE. Какую программу я должен использовать?

У меня есть launch4j, и он, похоже, делает именно то, что я хочу, но когда я пытаюсь запустить приложение, я получаю: "Это приложение было настроено на использование связанной Java-среды выполнения, но среда выполнения отсутствует или повреждена".

Я хочу, чтобы мое приложение было просто исполняемым exe, а не установщиком. По крайней мере, может ли кто-нибудь показать мне, как правильно связать JRE с launch4j?

4b9b3361

Ответ 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