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

时间:2012-02-17 14:43:05

标签: java windows batch-file launch4j winrun4j

要求

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

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

经过测试的解决方案

WinRun4J

WinRun4j是一个启动Java应用程序的EXE文件。因为应用程序没有分叉新的Java进程,所以Windows认为EXE文件是应用程序。所以任务栏没有问题。文件关联有效,因为文件只能与EXE文件关联。

问题:

  • 不支持大字体。应用程序窗口是像素缩放的(与谷歌浏览器一样)。
  • 必须使用两个不同的EXE文件,具体取决于安装的JRE。因此,当安装64位JRE时,必须使用64位EXE文件启动应用程序。当安装32位JRE时,必须使用另一个EXE。这不是用户友好的,因为当只安装了32位JRE时,用户不明白为什么他必须在64位操作系统上使用32位EXE。

Launch4J

Launch4J创建一个32位EXE,启动外部Java进程以启动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项目中(使用thisthis插件),配置非常简单,除了任务栏固定外,一切都是开箱即用的。对于任务栏固定,Java应用程序必须按照this question的答案中的说明设置appModelUserId。

此外,Java应用程序必须由安装程序安装,安装程序必须至少安装一个指向EXE的快捷方式。此快捷方式还必须包含appModelUserId。使用NSIS,可以使用WinShell plugin和类似的配置来完成:

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

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

5 个答案:

答案 0 :(得分:7)

尝试Launch4j( http://launch4j.sourceforge.net/),它是一个简单的jar to exe包装器(实际上包装jar是可选的)。它应该解决您的Icon和Taskbar要求。它还能够定位已安装的JRE(一些可配置的规则)。我不太明白的字体问题,Swing应该根据Windows设置自动使用字体,除非你以某种方式在JRE选项或代码中覆盖它。

答案 1 :(得分:6)

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

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

有关桌面集成标记(shortcutoffline-allowed)以及文件关联(association),请参阅JNLP参考。这些仅在WS 1.5中受支持。

答案 2 :(得分:2)

我个人使用Launch4j(通过maven与 maven-launch4j-plugin 更加精确),并且我在我的应用程序中实现系统托盘管理...(参见{{3 }})。

答案 3 :(得分:1)

我在WinRun4J方面取得了很好的成功,但我对字体做的并不多,所以我承认我不知道为什么你会遇到你在那里描述的问题。

然而,根据您的描述,听起来您对Java本机启动器有非常具体的要求。为什么不写自己的?你可以从像WinRun4J(它是开源的,在Eclipse CPL下许可的)开始,然后根据你的需要进行修改。

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

答案 4 :(得分:1)

顺便说一下,还可以查看新功能,将您的应用放入工具栏/系统中:

Oracle有关于如何使用系统托盘的tutorial

那与Java SE 6相关的....让我也想到了新Java 7中其他好东西的可能性吗?