私はJavaでプログラミングするのは初めてですが、一般的にはすべてがどのように機能するかについてよく知っています。jarファイルとjreの両方をWindows実行可能ファイル(exe)に入れて、クライアントにJREをインストールする必要はありませんが、どのプログラムを使用すればよいですか?
Launch4jを持っているので、望みどおりに実行できますが、アプリを実行しようとすると、「このアプリケーションは、バンドルされたJava Runtime Environment破損しています。」
私のアプリはインストーラーではなく、単に実行可能なexeにしたいだけです。少なくとも、JREをlaunch4jに正しくバンドルする方法を教えてもらえますか?
JREをバンドルできる唯一の方法は、 Launch4J および Inno Setup Compiler を使用することでした。
まず、jre6
フォルダ(たとえば)出力ファイル(.exe)と同じディレクトリにあります。
次に、システムからJREをjre6フォルダーにコピーします。
次に、Launch4Jを開き、バンドルされたJREパスを設定します-jre6
。次に、[ビルド]ボタンをクリックします(明らかに、他のすべてのパラメーターを入力した後-ただし、[〜#〜] jre [〜#〜]タブ自体はバンドルされたJREパス値です。)
私はそれが機能することを期待していましたが、その後.exeを新しい場所に移動すると(jre6と同じ場所に配置されなくなります)フォルダー)を取得しますこのアプリケーションは、バンドルされたJava Runtime Environmentを使用するように構成されましたが、実行しようとするとランタイムが見つからないか破損していますエラーアプリケーション...
私は一日中これをいじくり回してきましたが、.exeファイルにJREを含めるためにLaunch4Jを取得する方法はありませんでした。彼らのドキュメントはこの問題をまったく示唆していないように思えるので、私の意見では本当に貧弱です。
そこで私が解決したのは、Inno Setup Compiler(ISC)を使用することでした。このアプリは、.exeをWindowsインストーラーファイルとしてラップするために使用されます。そこで、JREをインストーラーパッケージにコピーする設定をISCスクリプトに追加しました。スクリプトに追加した行([Files]
セクション):
Source: "M:\Netbeans\MyApp\jre6\*"; DestDir: "{app}\jre6\"; Flags: recursesubdirs createallsubdirs
...少し回避策がありますが、うまくいきました。
上記のすべての手順を繰り返します。並べ替えられます。
Launch4J製品を使用したことはありません。正しく構成するのに幸運です。
Sourceforgeのディスカッションフォーラムにアクセスして、他のヒントを探すことができるようです here
その他の提案:
IBM(Websphere)とOracleから見たほとんどの製品は、インストールディレクトリの下でJREを抽出し、インストールされたJREを使用するように起動バッチコマンドを構成します。基本的に、JREとjarファイルは一度にインストールされます。
通常、インストールexeは、既にインストールされているかどうかを確認し、既に存在する場合はそのステップをスキップします。これは、jarファイルのみのアップグレードに役立ちます。
ローカルにインストールすると、互換性がないかバグが含まれている可能性がある独自のJREをインストールする顧客の問題も解決します。これにより、既知のJREバージョンを処理できます。
アプリケーションへのグラフィカルコンポーネントがない場合、excelsiorルートは問題ありません(しばらく前に、その制限が変更された可能性があります)。他の制限もありますが、単一の実行可能インストーラーでコードとともにJREを配布する方が良いでしょう。
lanch4jがパッケージ化されたexeにjreをパッケージ化する簡単な方法は、ラップを使用することです。
warp-packer --Arch windows-x64 --input_dir mycrt --exec run.bat --output single.exe
そして、exeを起動するときにcmdウィンドウを停止します。
editbin /subsystem:windows
warp: https://github.com/dgiagio/warp
editbin:VSによりインストール
デモ:
Inno Setup用のバンドルされたJREソリューション
バンドルされたJREソリューションをアプリケーションjarで実装するために、次のことを行うInno Setupスクリプトを作成しました。
1)JREをインストールexeにコピーします
2)ターミナルコマンドに相当するものを実行します:Java -jar myjar.jar with the bundled 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
(n.b. 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 Setupの例に示されているか、ウィザードで生成された「通常の」コーディングを使用します。 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
お役に立てれば。
ネイティブコードコンパイラが必要なようです。これらのコンパイラは、JREを必要としないネイティブコードを生成します。
この記事を確認してください- https://www.excelsior-usa.com/articles/Java-to-exe.html#aot 。
Jreをlaunch4jにバンドルするのは簡単です。
jreを同じ出力フォルダーにコピーするだけです
バンドルjre環境テキストボックスで、jreフォルダー自体を指定します。
環境変数のテキストボックス(下の同じページにあります)で、binまで指定します
次に、exeを作成します。マシンにjreがなくても、期待どおりに動作します。
ありがとう