问题标签 [winrun4j]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
21411 浏览

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

要求

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

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

经过测试的解决方案

WinRun4J

WinRun4j是一个启动 Java 应用程序的 EXE 文件。因为应用程序没有派生新的 Java 进程,Windows 认为 EXE 文件就是应用程序。所以任务栏没有问题。文件关联有效,因为文件可以简单地与 EXE 文件相关联。

问题:

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

发射4J

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

问题:

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

在 Windows 上,您只需双击 JAR 文件即可启动应用程序。安装的 JRE 没关系,简单有效。但...

问题:

  • 应用程序无法固定到任务栏。
  • 无法在开始菜单中创建快捷方式。
  • 无法将文件与 JAR 文件相关联。

BAT/CMD

像这样的简单批处理文件可用于启动应用程序:

可以为此批处理文件创建快捷方式来设置自定义图标。

问题:

  • 启动应用程序时会弹出一个 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 应用程序必须设置一个 appModelUserId,如该问题的答案中所述。

此外,Java 应用程序必须由安装程序安装,该安装程序必须至少安装一个指向 EXE 的快捷方式。此快捷方式还必须包含 appModelUserId。使用 NSIS,这可以通过WinShell 插件和如下配置来完成:

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

0 投票
1 回答
3107 浏览

java - Windows 上 Java 的 32 位/64 位 exe 包装器的问题

winrun4j java exe 包装器的 ini 文件中,我设置 vm.version.min=1.7 以指定 Java 7 作为要求。但是当我运行它时,我无法让 winrun4j 识别出我安装了 java 7 jre,即使命令行中的 java -version 返回了它。

经过进一步调查,我意识到我的 Java 7 安装是 64 位,而我的 Java 6 安装是 32 位。然后我发现 winrun4j 有一些 64 位版本的命令(即 rcedit64),如果我构建一个 appname64.exe 而不是 appname.exe 它不再抱怨 Java 7。

  1. 所以有人可以确认这是我需要 64 位 exe 来运行 64 位 jvm 的问题吗
  2. 其次,如果是这种情况,我如何向用户展示它,我将安装程序包装为 exe,这是否意味着我需要为用户提供 installer.exe 和 installer64.exe 并向用户解释选择正确的不是基于他们的处理器,而是基于他们安装的 Java 版本(32 位或 64 位)

编辑:听起来事情就像我描述的那样,使用launch4j也许是一个解决方案

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

0 投票
1 回答
1385 浏览

java - 只为安装程序和应用程序将 jre 嵌入 WInrun4j 一次

为了安装我的 Windows 桌面应用程序,我使用 izpack 创建了一个安装程序,然后使用 winrun4j 从 exe 调用它,这也是 izpack 安装的一部分添加另一个 winrun4j 包装器,以便在安装后实际运行应用程序。

问题是win4runj.exe 需要使用正确的Java 类型才能工作,即如果exe 是64 位,则必须运行64 位jvm,如果exe 是32 位,则必须运行32 位jvm。这可能会让用户感到困惑,所以我打算利用 winrun4j 来使用嵌入式 jvm,然后提供两个下载

  • 小部件安装程序.exe(32 位)
  • widgetinstaller64.exe(64 位)

但我的困惑是,对于每次下载,我只想嵌入 jvm 一次,但由于我有两个 exe(安装程序和程序本身),所以无法解决如何执行此操作,可以这样做吗?

更新

如果我安装 JVM 两次(一次包含在使用 izpack 构建的 install.jar 中,一次添加到 zip 文件中以便 widgetinstaller.exe 可以使用),它是否可以工作。

  • widgetinstaller.exe 位于 c:\code\widget\installer
  • 从 Oracle 下载 32 位 jre
  • 安装到 c:\code\widget\32bitJVM
  • 编辑izpack.xml,添加<file src="C:/code/widget/JVM32bit" targetdir="$INSTALL_PATH"/>
  • 将安装程序 vm.location=32bitJVM/bin/client/JVM.dll 添加到 c:\code\widget\installer\widgetinstaller.ini
  • 将小部件本身 vm.location=../32bitJVM/bin/client/JVM.dll 添加到 c:\code\widget\widget.ini
  • 重建代码,并在 zip 文件中压缩包含 32bitJVM 以创建 widgetinstaller.zip(其中包含 32bitJVM、widgetinstaller.ini、widgetinstaller.exe、widgetinstaller.ico 和 install.jar)
  • 解压并双击widgetinstaller.exe进行安装

但我只想要一次 JVM,我知道我需要<file src="C:/code/widget/JVM32bit" targetdir="$INSTALL_PATH"/>从 izpack.xml 中删除,但是如何将我的 32bitJVM 复制到程序安装文件夹中

需要将相同的 JVM 保存到程序文件夹中。

似乎这必须在 izpack 本身之外完成?

编辑

解决方案是使用我可以使用 Izpack 5 安装文件中描述的 Izpack 松散包,而不是它是由 izpack 构建的 install.jar 的一部分

但是必须为路径设置什么非常令人困惑,文档错误地暗示您放入了相对链接http://izpack.org/documentation/installation-files.html#the-packs-element-packs

例子

izpack install.xml 在 C:\code\Widget\installer

打包时 izpack 安装应该有:

0 投票
4 回答
1987 浏览

java - 我可以使用 Izpack 5 安装一个文件,而不是它是由 izpack 构建的 install.jar 的一部分吗

我的安装 widget.zip zipfile 包含以下内容:

  • 32位Java
  • 安装.jar
  • 小部件安装程序.exe
  • 小部件安装程序.ini
  • 小部件安装程序.ico

总结一下:

  • 32bitJava 是从 Oracle 下载的 32 位 JRE
  • install.jar 是 Izpack 创建的安装程序
  • widgetinstaller.* 由 winrun4j 创建,为安装程序提供 exe 包装器。

因此,通过此设置,我可以安装我的应用程序,而无需用户安装 Java 运行时。

然而,一旦安装,实际的应用程序还需要一个 java 运行时才能实际运行。因此,目前 32bitJava 的副本作为 izpack 安装的一部分包含在内,即它存在于 install.jar 中并在安装时安装。

但这意味着我有两个 JVM 副本,并且因为 32bitJava 比我的实际应用程序大,所以我的下载量太大了。

那么如何在安装期间/之后将 32bitJava 文件夹复制到安装中,而不必将其包含在 install.jar 中?

0 投票
2 回答
2472 浏览

java - Izpack 因“文件扩展名“.js”没有脚本引擎而失败,

在使用 Izpack 5 Beta 11 的测试机器上,如果我使用运行捆绑的 64 位 java 的 64 位 winrun4j exe 启动 install.jar,则 Izpack 会抱怨

There is no script engine for file extension ".js",然后抱怨The installer could not launch with administrator permissions,然后尝试安装到默认安装目录失败,因为您没有管理员权限,安装到 C:/Program Files 之外的另一个文件夹可以完成

而如果我使用运行 32 位 java 的 32 位 winrun4j 安装程序运行它,它工作正常。

如果我直接运行 install.jar 而不使用 exe 包装器

即java -jar install.jar

它同时使用 32 位 JVM 和 64 位 JVM 给出这些错误。

所以我目前唯一可行的解​​决方案是安装 32 位 exe 包装器,但我还需要 64 位包装器。

所以问题是

  1. 为什么 32 位 exe 可以工作而 64 位 exe 不能工作
  2. 如果我尝试在没有包装器的情况下安装,为什么 32 位或 64 位都没有。

跟进

我发现了这个关于 javascript 错误(但不是 Izpack)的线程,并发现 .js 文件与 Utlradedit 相关联,Utlradedit 是我用于编辑大多数文件类型的编辑器。

简单地将 .js 与 Ultraedit 取消关联意味着现在当我运行

  • java -jar install.jar 在 32bit install.jar 上使用 32bit java
  • java -jar install.jar 在 64 位 install.jar 上使用 64 位 java
  • 32 位 winrun4j 包装器。

它现在可以工作了:)

但是 64 位 winrun4j 现在无法开始安装并且根本不起作用,如果我从命令行窗口运行,我可以看到它

跑步的

他们跑

所以后续问题是:

  1. 为什么简单地将文件类型与编辑器关联会破坏这个 javascript 的东西,我可以想象这个或类似的问题可能会影响很多用户。
  2. 为什么从我的 64 位包装器运行会导致 installer.js 运行 Abort Exit
0 投票
1 回答
1070 浏览

java - 如何防止在winrun4j中显示控制台窗口

我在 java 中创建了一个桌面 gui 应用程序,并使用 WinRun4J 创建了一个本地 Windows 启动器。

我的ini文件看起来像这样

我关闭了控制台日志记录(log.level=none),但它一直显示额外的控制台窗口(在屏幕截图上标记为红色,我的应用程序的窗口在后台)。如何预防?

在此处输入图像描述

0 投票
1 回答
542 浏览

java - 调用由 winrun4j 制作的 Windows 服务中的方法

我使用 WinRun4J 从 jar 文件创建了一个 Windows 服务,到目前为止它非常基础。

当服务启动时,它每隔几秒钟就会不断写入位于根文件夹中的 result.txt .. (仅用于尝试 WinRun4J)

现在我的问题是,我可以在服务 jar 中做一个方法吗,像这样

然后从系统上不同的java文件调用这个方法,即

WriteToFile 应该使用一些参数调用 write 。

可能吗?如果是这样,怎么办?

这样做的总体目的是让服务运行,我可以通过 GUI 调用方法。

0 投票
4 回答
2717 浏览

java - WinRun4J 服务示例不运行

有谁知道如何运行 WinRun4J 服务示例(随软件分发的 ServiceTest 类)?我在一个 64 位的 Windows 7 机器上,并且安装了 Java 7 JDK 和 JRE。

我执行了以下操作:

  1. 复制WinRun4J64c.exeC:\test,重命名service64.exe
  2. 复制service.ini到C:\test,重命名service64.ini
  3. 最后,我复制WinRun4JTest.jarC:\test.

首先,您必须以管理员身份运行命令提示符,否则您无法注册该服务。因此,在以管理员身份打开的命令提示符下,我输入了以下命令:

到目前为止,一切都很好。但是当我去 Windows 服务面板启动服务时,我得到了错误:

“错误 1053:服务没有及时响应……”

有任何想法吗?

谢谢

0 投票
1 回答
1306 浏览

java - WinRun4J - 无法加载库 jar

我正在尝试使用 WinRun4J 将我的 Java 程序作为 Windows 服务执行。该服务已正确创建并运行,直到由于 ClassNotFoundException 而停止:

我怀疑 WinRun4J 没有加载我在 lib 文件夹中的 lib jar。我的应用程序工作目录是这样的:

主应用程序 jar 在 bin 文件夹中,其他 jar 在 lib 文件夹中。这是我的 servico.ini 文件,由 WinRun4J 使用:

我在 classpath.2 中尝试了很多变体,但都没有成功。
我做错了什么?

0 投票
1 回答
3832 浏览

java - 如何使用 WinRun4J 将 Java 应用程序作为 Windows 服务运行

我正在尝试使用 WinRun4J 将 Java 应用程序作为 Windows 服务运行。

我将 WinRun4J64c.exe 复制到我的应用程序目录中,并将以下 service.ini 文件放在旁边:

但是,如果我以以下方式启动服务:WinRun4J64c.exe --WinRun4J:RegisterService我得到:

怎么了?