在Windows 7上启动Java应用程序的最佳方法是什么?

要求

我想在Windows 7上发布Java GUI应用程序。此应用程序使用Swing Toolkit,不需要任何本机代码。 该应用程序使用NSIS安装程序进行安装。 我想尽可能将这个应用程序集成到Windows 7中。 意即:

  • 应用程序运行时,必须可以将应用程序固定到任务栏。
  • 必须能够将数据文件与应用程序相关联,以便Windows使用我的应用程序打开这些文件。
  • 必须自动使用32位Java运行时和64位Java运行时。 所以,当用户卸载一个32位的Java,并安装一个64位的Java(反之亦然),那么我的应用程序必须仍然工作。
  • 必须支持Windows的大字体设置。 我不太了解这个function。 我只是知道一些应用程序完全忽略它,其他人(像谷歌浏览器)是像素缩放(看起来很丑),而其他人通过简单地使用更大的字体支持它(这是我想要的,通常它的工作原理只有WinRun4J解决scheme以下提到不起作用)。

testing的解决scheme

WinRun4J

WinRun4j是启动Java应用程序的EXE文件。 因为应用程序不分叉新的Java进程Windows认为EXE文件是应用程序。 所以任务栏没有问题。 文件关联工作,因为文件可以简单地与EXE文件相关联。

问题:

  • 不支持大字体。 应用程序窗口像素缩放,而不是像谷歌浏览器。
  • 根据安装的JRE,必须使用两个不同的EXE文件。 所以当安装64位JRE时,应用程序必须以64位EXE文件启动。 安装32位JRE时,必须使用其他EXE。 这不是用户友好的,因为用户不明白为什么只安装32位JRE时,他必须使用64位操作系统上的32位EXE。

Launch4J

Launch4J创build一个32位EXE,启动一个外部Java进程来启动Java应用程序。 所以不像WinRun4J,它也可以启动一个64位的Java。

问题:

  • 无法将应用程序固定到任务栏。
  • 如果headerType="gui"System.out.println将不会打印到控制台,无论应用程序是否从控制台启动。

jar

在Windows上,您只需双击JAR文件即可启动应用程序。 安装的JRE无所谓,简单的工作。 但…

问题:

  • 应用程序不能被固定到任务栏。
  • 无法在开始菜单中创build快捷方式。
  • 无法将文件与JAR文件相关联。

BAT / CMD

像这样一个简单的batch file可以用来启动应用程序:

 @echo off start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1 

可以为此batch file创build一个快捷方式来设置自定义图标。

问题:

  • 应用程序启动时popup一个DOS窗口。
  • batch file不知道javaw.exe的位置。 根据安装的java版本(32或64位),它可能位于c:\windows\syswow64而Windows不会自动将这个调用从batch file中redirect。 使用JAVA_HOME环境variables也是不行的,因为Java不会自动设置它。
  • 将文件与batch file关联时,不能设置自定义图标。
  • 任务栏支持不正常。 应用程序可以固定在batch file手动启动,但双击相关的文件,而不是工作。

捷径

不使用batch file,只能创build一个启动应用程序的快捷方式。 它链接到这个命令: c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" 。 如果安装了32位Java JRE,Windows会自动将此调用redirect到SysWOW64目录。

问题:

  • 由于Windows只接受EXE / COM / PIF / BAT / CMD文件作为关联目标,因此无法将文件与其关联。 LNK文件不起作用。

还有另外一个解决scheme能够满足上面所有的要求吗? 或者是否有任何技巧来解决上述解决scheme的问题?

解决使用Launch4j的任务栏钉住问题看起来像是最好的解决scheme。 Launch4j可以很容易地集成到一个Maven项目(使用这个或这个插件),configuration是非常容易的,除了任务栏固定之外,一切都可以使用。 对于任务栏固定,Java应用程序必须设置一个appModelUserId,如本问题的答案中所述。

另外,Java应用程序必须由安装程序安装,安装程序必须至less安装一个指向EXE的快捷方式。 这个快捷方式还必须包含appModelUserId。 使用NSIS,可以使用WinShell插件和这样的configuration完成:

 CreateShortCut "$SMPROGRAMS\MyApp.lnk" \ "$INSTDIR\myapp.exe" "" "$INSTDIR\myapp.exe" 0 SW_SHOWNORMAL WinShell::SetLnkAUMI "$SMPrograms\MyApp.lnk" "MyAppModelUserId" 

由于某些未知的原因,这个捷径只能存在。 你不必使用它。 您可以双击EXE,任务栏locking仍然有效。 您甚至可以在应用程序文件夹的某个子文件夹中创build快捷方式。 当EXE文件的最后一个快捷方式被删除时,任务栏locking停止工作。

尝试Launch4j( http://launch4j.sourceforge.net/ ),它是一个简单的jar来执行包装(实际上包装的jar是可选的)。 它应该解决您的图标和任务栏的要求。 它也能够定位安装的JRE(一些可configuration的规则)。 字体问题我不太清楚,Swing应该根据Windows的设置自动使用字体,除非你以某种方式覆盖了JRE选项或代码中的字体。

Java Web Start – 现在我不会考虑以任何其他方式分发应用程序。

用户确实需要至less有J2SE 1.4; 如果您的应用程序需要更高版本,Web Start将自动下载适当的JRE。

查看用于桌面集成的标签( shortcutoffline-allowed )以及文件关联( association )的JNLP参考。 但是,这些仅在WS 1.5中受支持。

我个人使用Launch4j(通过使用maven-launch4j-pluginMaven更加精确),并且在我的应用程序中实现了系统托盘pipe理。(请参阅http://java.sun.com/developer/technicalArticles / J2SE / Desktop / javase6 / systemtray / )。

WinRun4J整体上已经取得了很好的成绩,但是我并没有在字体上做太多的工作,所以我会承认,我不确定我是否明白为什么你会遇到这个问题。

然而,从您所描述的内容来看,这听起来像是来自Java本机启动器的非常具体的要求。 为什么不写自己的? 你可以从WinRun4J开始(这是开源的,在Eclipse CPL下许可),只需要修改它就可以满足你的需求。

或者,您可以查看其他程序使用的本机启动器。 Eclipse和NetBeans启动器似乎工作得很好,都是开源的。 你也可以很容易地适应其中的一个。

另外,还可以查看新function,在tooltray / systemtray中添加您的应用程序:

Oracle有一个关于如何使用系统托盘的教程 。

这是与Java SE 6相关的….使我还能在更新的Java 7中使用其他好东西?