要件
Windows7でJavaGUIアプリケーションを公開したい。このアプリケーションはSwingToolkitを使用しており、ネイティブコードは必要ありません。アプリケーションは、NSISインストーラーを使用してインストールされます。このアプリケーションをできるだけWindows7に統合したいと思います。これの意味は:
- アプリケーションの実行中は、アプリケーションをタスクバーに固定できる必要があります。
- Windowsがこれらのファイルをアプリケーションで開くように、データファイルをアプリケーションに関連付けることができる必要があります。
- 32ビットのJavaランタイムと64ビットのJavaランタイムで自動的に動作する必要があります。したがって、ユーザーが32ビットJavaをアンインストールし、代わりに64ビットJavaをインストールした場合(またはその逆)、アプリケーションは引き続き機能する必要があります。
- Windowsの大きなフォント設定をサポートする必要があります。私はこの機能を本当に理解していません。一部のアプリケーションはそれを完全に無視し、他のアプリケーション(Google Chromeのように)はピクセルスケール(本当に醜いように見えます)であり、他のアプリケーションは意図したとおりに大きなフォントを使用するだけでそれをサポートします(それは私が望むものであり、通常は機能します。WinRun4Jソリューションのみ下記はそれでは動作しません)。
テスト済みのソリューション
WinRun4J
WinRun4jは、Javaアプリケーションを起動するEXEファイルです。アプリケーションは新しいJavaプロセスをフォークしないため、WindowsはEXEファイルがアプリケーションであると見なします。したがって、タスクバーに問題はありません。ファイルはEXEファイルに簡単に関連付けることができるため、ファイルの関連付けは機能します。
問題:
- 大きなフォントはサポートしていません。代わりに、アプリケーションウィンドウはピクセルスケールになります(Google Chromeのように)。
- インストールされているJREに応じて、2つの異なるEXEファイルを使用する必要があります。したがって、64ビットJREをインストールする場合は、64ビットEXEファイルを使用してアプリケーションを起動する必要があります。32ビットのJREがインストールされている場合は、他のEXEを使用する必要があります。32ビットのJREのみがインストールされているのに、64ビットのオペレーティングシステムで32ビットのEXEを使用する必要がある理由をユーザーが理解していないため、これはユーザーフレンドリーではありません。
Launch4J
Launch4Jは、外部Javaプロセスを起動してJavaアプリケーションを起動する32ビットEXEを作成します。したがって、WinRun4Jとは異なり、64ビットJavaを起動することもできます。
問題:
- アプリケーションをタスクバーに固定できません。
System.out.println
headerType="gui"
アプリケーションがコンソールから起動されているかどうかに関係なく、の場合はコンソールに出力されません。
JAR
Windowsでは、JARファイルをダブルクリックするだけでアプリケーションを起動できます。インストールされたJREは重要ではなく、単に機能します。だが...
問題:
- アプリケーションをタスクバーに固定できません。
- スタートメニューにショートカットを作成できません。
- ファイルをJARファイルに関連付けることはできません。
BAT / CMD
このような単純なバッチファイルを使用して、アプリケーションを起動できます。
@echo off
start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1
このバッチファイルのショートカットを作成して、カスタムアイコンを設定できます。
問題:
- アプリケーションの起動時にDOSウィンドウがポップアップします。
- バッチファイルは、javaw.exeがどこにあるかを知りません。インストールされているJavaバージョン(32ビットまたは64ビット)によっては、
c:\windows\syswow64
代わりに配置される場合があり、Windowsはバッチファイルからのこの呼び出しを自動的にリダイレクトしません。JAVA_HOME
Javaはこれを自動的に設定しないため、環境変数を使用することもできません。 - ファイルをバッチファイルに関連付ける場合、カスタムアイコンを設定することはできません。
- タスクバーのサポートが正しく機能していません。バッチファイルを手動で開始するとアプリケーションを固定できますが、代わりに関連ファイルをダブルクリックすると機能しません。
ショートカット
バッチファイルを使用する代わりに、アプリケーションを起動するためのショートカットのみを作成することができます。このコマンドにリンクしています:c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar"
。32ビットのJavaJREがインストールされている場合、Windowsはこの呼び出しをSysWOW64ディレクトリに自動的にリダイレクトします。
問題:
- WindowsはEXE/COM / PIF / BAT / CMDファイルのみを関連付けターゲットとして受け入れるため、ファイルを関連付けることはできません。LNKファイルは機能しません。
質問
上記のすべての要件を満たす別のソリューションはありますか?または、言及された解決策の問題を解決するためのトリックはありますか?
解決
Launch4jを使用してタスクバーの固定の問題を解決した後、最良の解決策のように見えます。Launch4jは(このプラグインまたはこのプラグインを使用して)Mavenプロジェクトに簡単に統合でき、構成は非常に簡単で、タスクバーの固定を除いてすべてがすぐに機能します。タスクバーを固定するには、この質問への回答で説明されているように、JavaアプリケーションでappModelUserIdを設定する必要があります。
さらに、Javaアプリケーションは、EXEを指すショートカットを少なくとも1つインストールする必要があるインストーラーによってインストールされる必要があります。このショートカットには、appModelUserIdも含まれている必要があります。NSISでは、これはWinShellプラグインと次のような構成で実行できます。
CreateShortCut "$SMPROGRAMS\MyApp.lnk" \
"$INSTDIR\myapp.exe" "" "$INSTDIR\myapp.exe" 0 SW_SHOWNORMAL
WinShell::SetLnkAUMI "$SMPrograms\MyApp.lnk" "MyAppModelUserId"
何らかの理由で、このショートカットが存在する必要があるだけです。使用する必要はありません。EXEをダブルクリックしても、タスクバーの固定は引き続き機能します。アプリケーションフォルダのサブフォルダにショートカットを作成することもできます。EXEファイルの最後のショートカットが削除されると、タスクバーの固定が機能しなくなります。