web-dev-qa-db-ja.com

Windows 7でJavaアプリケーションを開始するための最良の方法は何ですか?

必要条件

Java GUIアプリケーションをWindows 7で公開したい。このアプリケーションはSwing Toolkitを使用しており、ネイティブコードを必要としない。アプリケーションは [〜# 〜] nsis [〜#〜] インストーラーです。このアプリケーションをWindows 7にできる限り統合したいと考えています。これは、次のことを意味します。

  • アプリケーションの実行中は、アプリケーションをタスクバーに固定できる必要があります。
  • Windowsがアプリケーションでこれらのファイルを開くように、データファイルをアプリケーションに関連付けることが可能でなければなりません。
  • 32ビットJavaランタイムおよび64ビットJavaランタイムで自動的に機能する必要があります。したがって、ユーザーが32ビットJavaおよび64ビットをインストールJava代わりに(またはその逆))、アプリケーションは引き続き機能する必要があります。
  • Windowsの大きなフォント設定をサポートする必要があります。この機能がよくわかりません。一部のアプリケーションはそれを完全に無視すること、他のアプリケーション(Google Chromeのように)はピクセルスケール(本当に醜い)であり、他のアプリケーションは単に大きなフォントを意図したとおりに使用することでサポートします(これが私が望むものであり、通常は機能します。WinRun4Jソリューションのみ以下に記載されているものは動作しません)。

テスト済みのソリューション

WinRun4J

WinRun4j はJavaアプリケーションを起動するEXEファイルです。アプリケーションは新しいJavaプロセスをフォークしないため、WindowsはEXEファイルISアプリケーション。タスクバーに問題はありません。ファイルは単にEXEファイルに関連付けることができるため、ファイルの関連付けは機能します。

問題:

  • 大きなフォントはサポートしていません。アプリケーションウィンドウは、代わりにピクセルスケールされます(Google Chromeのように)。
  • インストールされているJREに応じて、2つの異なるEXEファイルを使用する必要があります。したがって、64ビットJREがインストールされている場合、アプリケーションは64ビットEXEファイルで起動する必要があります。 32ビットJREがインストールされている場合は、他のEXEを使用する必要があります。ユーザーは、32ビットJREのみがインストールされているときに64ビットオペレーティングシステムで32ビットEXEを使用する必要がある理由を理解していないため、ユーザーフレンドリーではありません。

Launch4J

Launch4J は、外部Javaプロセスを起動するための32ビットEXEを作成しますJavaアプリケーションを起動します。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ビットJava JREがインストールされている場合、Windowsはこの呼び出しをSysWOW64ディレクトリに自動的にリダイレクトします。

問題:

  • WindowsはEXE/COM/PIF/BAT/CMDファイルのみを関連付けターゲットとして受け入れるため、ファイルを関連付けることはできません。 LNKファイルは機能しません。

質問

上記のすべての要件を満たす別のソリューションはありますか?または、言及されたソリューションの問題を解決するためのトリックはありますか?

解決

Launch4j を使用してタスクバーのピン留めの問題を解決すると、最良の解決策のように見えます。 Launch4jは、Mavenプロジェクトに簡単に統合できます( this または this プラグインを使用)。設定は非常に簡単で、タスクバーの固定を除いてすべてがそのまま機能します。タスクバーのピン留めの場合、Javaアプリケーションは この質問 の回答で説明されているようにappModelUserIdを設定する必要があります。

さらに、Javaアプリケーションは、EXEを指す1つのショートカットを少なくとも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ファイルの最後のショートカットを削除すると、タスクバーの固定が機能しなくなります。

36
kayahr

Launch4j( http://launch4j.sourceforge.net/ )を試してください。これは、ラッパーを実行するための単純なjarです(実際にはjarのラッピングはオプションです)。アイコンとタスクバーの要件を解決するはずです。インストールされているJRE(一部の設定可能なルール)を検索することもできます。フォントの問題はよくわかりません。JREオプションまたはコードで上書きしない限り、SwingはWindowsの設定に応じて自動的にフォントを使用するはずです。

7
Durandal

Java Web Start -最近は、アプリケーションを他の方法で配布することは考えていません。

ユーザーには少なくともJ2SE 1.4が必要です。アプリケーションに新しいバージョンが必要な場合、Web Startは適切なJREを自動的にダウンロードします。

デスクトップ統合用のタグ(shortcutおよびoffline-allowed)については、 [〜#〜] jnlp [〜#〜] リファレンスを参照してください。ファイルの関連付け(association)。ただし、これらはWS 1.5でのみサポートされています。

6
Dmitri

Launch4jを個人的に使用し(maven-launch4j-pluginを使用してmavenを介してより正確に)、アプリケーション内からシステムトレイ管理を実装します...( http://Java.Sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/ を参照)。

2
Yanflea

余談ですが、アプリをツールトレイ/システムトレイに配置するための新機能も確認してください。

Oracleには、システムトレイの使用方法について チュートリアル があります。

それはJava SE 6に関連しています... ...新しいJava 7?

1
DotJava

WinRun4Jは全体的にはうまくいきましたが、フォントについてはそれほど多くは行っていないので、そこに記載されている問題が発生している理由を理解できていないことを認めます。

しかし、あなたが説明したことから、Javaネイティブランチャーからの非常に具体的な要件があるように思われます。独自のランチャーを作成するだけではどうですか?WinRun4J(オープンソースである、 Eclipse CPLの下でライセンスされ、必要に応じて変更します。

または、他のプログラムで使用されるネイティブランチャーを調べることもできます。 EclipseランチャーとNetBeansランチャーはどちらもかなりうまく機能しているようで、どちらもオープンソースです。そのうちの1つをかなり簡単に適応させることもできます。

1
Daniel Pryden