问题标签 [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.
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.println
headerType="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 文件的最后一个快捷方式后,任务栏固定停止工作。
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。
- 所以有人可以确认这是我需要 64 位 exe 来运行 64 位 jvm 的问题吗
- 其次,如果是这种情况,我如何向用户展示它,我将安装程序包装为 exe,这是否意味着我需要为用户提供 installer.exe 和 installer64.exe 并向用户解释选择正确的不是基于他们的处理器,而是基于他们安装的 Java 版本(32 位或 64 位)
编辑:听起来事情就像我描述的那样,使用launch4j也许是一个解决方案
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 安装应该有:
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 中?
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 位包装器。
所以问题是
- 为什么 32 位 exe 可以工作而 64 位 exe 不能工作
- 如果我尝试在没有包装器的情况下安装,为什么 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 现在无法开始安装并且根本不起作用,如果我从命令行窗口运行,我可以看到它
跑步的
他们跑
所以后续问题是:
- 为什么简单地将文件类型与编辑器关联会破坏这个 javascript 的东西,我可以想象这个或类似的问题可能会影响很多用户。
- 为什么从我的 64 位包装器运行会导致 installer.js 运行 Abort Exit
java - 如何防止在winrun4j中显示控制台窗口
我在 java 中创建了一个桌面 gui 应用程序,并使用 WinRun4J 创建了一个本地 Windows 启动器。
我的ini文件看起来像这样
我关闭了控制台日志记录(log.level=none),但它一直显示额外的控制台窗口(在屏幕截图上标记为红色,我的应用程序的窗口在后台)。如何预防?
java - 调用由 winrun4j 制作的 Windows 服务中的方法
我使用 WinRun4J 从 jar 文件创建了一个 Windows 服务,到目前为止它非常基础。
当服务启动时,它每隔几秒钟就会不断写入位于根文件夹中的 result.txt .. (仅用于尝试 WinRun4J)
现在我的问题是,我可以在服务 jar 中做一个方法吗,像这样
然后从系统上不同的java文件调用这个方法,即
WriteToFile 应该使用一些参数调用 write 。
可能吗?如果是这样,怎么办?
这样做的总体目的是让服务运行,我可以通过 GUI 调用方法。
java - WinRun4J 服务示例不运行
有谁知道如何运行 WinRun4J 服务示例(随软件分发的 ServiceTest 类)?我在一个 64 位的 Windows 7 机器上,并且安装了 Java 7 JDK 和 JRE。
我执行了以下操作:
- 复制
WinRun4J64c.exe
到C:\test
,重命名service64.exe
- 复制
service.ini
到C:\test,重命名service64.ini
- 最后,我复制
WinRun4JTest.jar
到C:\test
.
首先,您必须以管理员身份运行命令提示符,否则您无法注册该服务。因此,在以管理员身份打开的命令提示符下,我输入了以下命令:
到目前为止,一切都很好。但是当我去 Windows 服务面板启动服务时,我得到了错误:
“错误 1053:服务没有及时响应……”
有任何想法吗?
谢谢
java - WinRun4J - 无法加载库 jar
我正在尝试使用 WinRun4J 将我的 Java 程序作为 Windows 服务执行。该服务已正确创建并运行,直到由于 ClassNotFoundException 而停止:
我怀疑 WinRun4J 没有加载我在 lib 文件夹中的 lib jar。我的应用程序工作目录是这样的:
主应用程序 jar 在 bin 文件夹中,其他 jar 在 lib 文件夹中。这是我的 servico.ini 文件,由 WinRun4J 使用:
我在 classpath.2 中尝试了很多变体,但都没有成功。
我做错了什么?
java - 如何使用 WinRun4J 将 Java 应用程序作为 Windows 服务运行
我正在尝试使用 WinRun4J 将 Java 应用程序作为 Windows 服务运行。
我将 WinRun4J64c.exe 复制到我的应用程序目录中,并将以下 service.ini 文件放在旁边:
但是,如果我以以下方式启动服务:WinRun4J64c.exe --WinRun4J:RegisterService
我得到:
怎么了?