当前位置: 首页 > 面试题库 >

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

冯飞鹏
2023-03-14
问题内容

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

  • 当应用程序运行时,必须可以将应用程序固定到任务栏。
  • 必须有可能将数据文件与应用程序关联,以便Windows用我的应用程序打开这些文件。
  • 必须自动与32位Java运行时和64位Java运行时一起使用。因此,当用户卸载32位Java并安装64位Java时(反之亦然),则我的应用程序必须仍然可以运行。
  • 必须支持Windows的大字体设置。我不太了解这个功能。我只知道有些应用程序完全忽略了它,有些(例如Google Chrome)是像素缩放的(看起来确实很丑陋),而另一些应用程序只是通过按预期使用较大的字体来支持它(这就是我想要的,并且通常它可以工作。只有WinRun4J解决方案下面提到的内容不适用于它)。

经过测试的解决方案

WinRun4J

WinRun4j是一个EXE文件,它将启动Java应用程序。由于该应用程序没有派生新的Java进程,因此Windows认为EXE文件就是该应用程序。因此,任务栏没有问题。文件关联之所以起作用,是因为这些文件可以简单地与EXE文件关联。

问题:

  • 不支持大字体。应用程序窗口改为像素缩放(例如Google Chrome)。
  • 根据安装的JRE,必须使用两个不同的EXE文件。因此,当安装了64位JRE时,必须使用64位EXE文件启动应用程序。如果安装了32位JRE,则必须使用其他EXE。这不是用户友好的,因为用户不理解为什么仅安装32位JRE时必须在64位操作系统上使用32位EXE。

Launch4J

Launch4J创建一个32位EXE,该EXE将启动外部Java进程以启动Java应用程序。因此,与WinRun4J不同,它还可以启动64位Java。

问题:

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

在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项目中(使用此插件或此插件),配置非常简单,除了任务栏固定之外,其他所有组件都可以直接使用。为了固定任务栏,Java应用程序必须按照[此问题]http://codingdict.com/questions/112034)的答案中的说明设置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文件的最后一个快捷方式后,任务栏固定停止工作。


问题答案:

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



 类似资料:
  • 问题内容: Java是我选择的编程语言之一。尽管将应用程序分发给最终用户,但我总是遇到问题。 为用户提供JAR并不总是像我想要的那样友好,并且使用Java WebStart要求我维护Web服务器。 分发Java应用程序的最佳方法是什么?如果Java应用程序需要在用户计算机上安装工件,该怎么办?有没有好的Java安装/打包系统? 问题答案: 有多种解决方案,取决于你的发行要求。 只是用一个jar。这

  • 这并不困难,但它让我质疑spring auth服务器是最好的选择,还是我应该使用Keycloak?

  • 问题内容: 当前,我们的Java应用程序使用制表符分隔的* .cfg文件中包含的值。我们需要更改此应用程序,以使其现在使用XML文件。 为了从此文件中读取值,使用的最佳/最简单的库是什么? 问题答案: 当然,根据您的需要有很多好的解决方案。如果只是配置,则应查看Jakarta commons- configuration 和commons- digester 。 您总是可以使用获取文档的标准JDK

  • 我有两个问题,我找不到任何流行/广泛接受的解决方案: > 使用Java程序启动zookeeper服务器最简单的方法是什么? 而且,是否可以将服务器添加到zookeeper集群,而无需手动转到每台机器并使用新节点的id和ip:端口条目更新其配置文件? 有人能帮忙吗?谢谢。

  • 问题内容: 在应用程序中是否有任何良好的GUI作为小部件支持Pygame表面? 如果这不可能或不可行,那么哪个GUI工具箱具有最佳的图形组件?我希望通过SDL包装器保持快速渲染成为可能。 问题答案: 在这里,您将获得有关如何整合以及进行互动和互动的说明。 在我看来,最好的GUI工具包是wxPython(wxWidgets的绑定),它具有几乎包括OpenGL小部件在内的所有GUI小部件,并且SDL也

  • 问题内容: 这种功能可以在服务器群集上运行应用程序,以分配负载并提供额外的冗余。 我看过GridGain的演示文稿,对此印象深刻。 认识其他人吗? 问题答案: 有几个: Terracotta(开源,基于Mozilla Public License); Oracle Coherence(以前是Tangosol Coherence;商业;基于JSR 107,从未正式采用); GigaSpaces(商业