在 Windows 7 上启动 Java 应用程序的最佳方式是什么?要求经过测试的解决方案问题溶液

2022-09-01 06:16:32

要求

我想在 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\syswow64JAVA_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 文件的最后一个快捷方式。


答案 1

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


答案 2

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

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

有关桌面集成 ( 和 ) 和 文件关联 () 的标记,请参阅 JNLP 参考。但是,这些仅在WS 1.5中受支持。shortcutoffline-allowedassociation


推荐