要求
我想在Windows 7上发布Java GUI应用程序。该应用程序使用的是Swing工具包,不需要任何 native 代码。该应用程序是使用NSIS安装程序安装的。我想将此应用程序尽可能地集成到Windows 7中。这表示:
经过测试的解决方案
WinRun4J
WinRun4j是一个EXE文件,它将启动Java应用程序。由于该应用程序没有派生新的Java进程,因此Windows认为EXE文件就是该应用程序。因此,任务栏没有问题。文件关联之所以起作用,是因为这些文件可以简单地与EXE文件关联。
问题:
Launch4J
Launch4J创建一个32位EXE,该EXE将启动一个外部Java进程来启动Java应用程序。因此,与WinRun4J不同,它还可以启动64位Java。
问题:
System.out.println
,则headerType="gui"
不会打印到控制台,无论是否从控制台启动了应用程序。 jar
在Windows上,您只需双击JAR文件即可启动该应用程序。安装的JRE无关紧要,仅能正常工作。但...
问题:
BAT/CMD
这样的简单批处理文件可用于启动应用程序:
@echo off
start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1
可以为此批处理文件创建快捷方式以设置自定义图标。
问题:
c:\windows\syswow64
中,并且Windows不会自动从批处理文件中重定向此调用。也不可以使用JAVA_HOME
环境变量,因为Java不会自动设置它。 捷径
代替使用批处理文件,只能创建一个快捷方式来启动应用程序。它链接到以下命令:
c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar"
。如果安装了32位Java JRE,Windows会自动将此调用重定向到SysWOW64目录。问题:
问题
是否有另一个解决方案可以满足以上所有要求?还是有任何技巧可以解决上述解决方案中的问题?
解决方案
解决了使用Launch4j的任务栏固定问题后,这似乎是最好的解决方案。 Launch4j可以轻松集成到Maven项目中(使用this或this插件),配置非常简单,除了任务栏固定之外,其他所有功能都可以立即使用。为了固定任务栏,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文件的最后一个快捷方式后,任务栏固定停止工作。
最佳答案
尝试使用Launch4j( http://launch4j.sourceforge.net/),它是一个简单的jar到exe包装器(实际上包装jar是可选的)。它应该可以解决您的图标和任务栏要求。它还能够定位已安装的JRE(一些可配置的规则)。字体问题我不太了解,Swing应该根据Windows设置自动使用字体,除非您以某种方式在JRE选项或代码中覆盖了字体。
关于java - 在Windows 7上启动Java应用程序的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330209/