在 Windows 7 上启动 Java 应用程序的最佳方式是什么?要求经过测试的解决方案问题溶液
要求
我想在 Windows 7 上发布一个 Java GUI 应用程序。此应用程序使用的是 Swing 工具包,不需要任何本机代码。该应用程序是使用 NSIS 安装程序安装的。我想尽可能好地将此应用程序集成到Windows 7中。这意味着:
- 当应用程序运行时,必须能够将应用程序固定到任务栏。
- 它必须能够将数据文件与应用程序相关联,以便Windows使用我的应用程序打开这些文件。
- 必须自动使用 32 位 Java 运行时和 64 位 Java 运行时。因此,当用户卸载32位Java并安装64位Java时(反之亦然),那么我的应用程序必须仍然工作。
- 必须支持 Windows 的大字体设置。我真的不明白这个功能。我只知道有些应用程序完全忽略它,其他应用程序(如Google Chrome)是像素缩放的(看起来非常丑陋),而其他应用程序则通过简单地使用预期的较大字体来支持它(这就是我想要的,通常它可以工作。只有下面提到的WinRun4J解决方案不能与它一起使用)。
经过测试的解决方案
赢润4J
WinRun4j是一个EXE文件,用于启动Java应用程序。因为应用程序不会分叉一个新的Java进程,所以Windows认为EXE文件就是应用程序。因此,任务栏没有问题。文件关联工作,因为文件可以简单地与EXE文件关联。
问题:
- 不支持大字体。应用程序窗口是像素缩放的(如谷歌浏览器)。
- 必须使用两个不同的 EXE 文件,具体取决于安装的 JRE。因此,当安装64位JRE时,必须使用64位EXE文件启动应用程序。当安装了 32 位 JRE ins 时,必须使用其他 EXE。这不是用户友好的,因为用户不明白为什么当只安装了32位JRE时,他必须在64位操作系统上使用32位EXE。
发射4J
Launch4J 创建一个 32 位 EXE,该 EXE 启动一个外部 Java 进程来启动 Java 应用程序。因此,与WinRun4J不同,它还可以启动64位Java。
问题:
- 无法将应用程序固定到任务栏。
-
System.out.println
如果 为,则不会打印到控制台,无论应用程序是从控制台启动的。headerType="gui"
罐
在 Windows 上,您只需双击 JAR 文件即可启动应用程序。安装的JRE无关紧要,只需工作即可。但。。。
问题:
- 无法将应用程序固定到任务栏。
- 无法在“开始”菜单中创建快捷方式。
- 无法将文件与 JAR 文件关联。
蝙蝠/CMD
可以使用如下所示的简单批处理文件来启动应用程序:
@echo off
start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1
可以为此批处理文件创建快捷方式以设置自定义图标。
问题:
- 启动应用程序时会弹出一个 DOS 窗口。
- 批处理文件不知道 javaw.exe 所在的位置。根据安装的java版本(32或64位),它可能位于其中,并且Windows不会自动从批处理文件重定向此调用。使用环境变量也是不行的,因为Java不会自动设置它。
c:\windows\syswow64
JAVA_HOME
- 将文件与批处理文件关联时,不能设置自定义图标。
- 任务栏支持无法正常工作。当手动启动批处理文件时,可以将应用程序固定到它,但是当双击关联的文件时,它不起作用。
捷径
无需使用批处理文件,只需创建快捷方式即可启动应用程序。它链接到此命令:。如果安装了 32 位 Java JRE,Windows 会自动将此调用重定向到 SysWOW64 目录。c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar"
问题:
- 无法将文件与其关联,因为 Windows 仅接受 EXE/COM/PIF/BAT/CMD 文件作为关联目标。LNK 文件不起作用。
问题
有没有另一种解决方案可以满足上述所有要求?或者是否有任何技巧可以通过上述解决方案解决问题?
溶液
使用Launch4j解决任务栏固定问题后,看起来是最好的解决方案。Launch4j可以很容易地集成到Maven项目中(使用这个或这个插件),配置非常简单,除了任务栏固定之外,一切都开箱即用。对于任务栏固定,Java 应用程序必须设置 appModelUserId,如本问题的答案中所述。
此外,Java 应用程序必须由安装程序安装,安装程序必须至少安装一个指向 EXE 的快捷方式。此快捷方式还必须包含 appModelUserId。使用NSIS,这可以通过WinShell插件和如下配置来完成:
CreateShortCut "$SMPROGRAMS\MyApp.lnk" \
"$INSTDIR\myapp.exe" "" "$INSTDIR\myapp.exe" 0 SW_SHOWNORMAL
WinShell::SetLnkAUMI "$SMPrograms\MyApp.lnk" "MyAppModelUserId"
由于某种未知的原因,这条捷径只需要存在。您不必使用它。您可以双击 EXE,任务栏固定仍然有效。您甚至可以在应用程序文件夹的某些子文件夹中创建快捷方式。任务栏固定停止工作时,删除 EXE 文件的最后一个快捷方式。