我的计算机上有Launch4J,这是一个很棒的程序.我感兴趣的一个功能是能够在一般.EXE文件中捆绑JRE.但是,我找不到任何描述如何执行此操作的文档.
如何将JRE与EXE捆绑在一起?另外,我在哪里可以运行紧凑的便携式JRE?Oracle上的下载链接用于安装程序包.
我想在Windows 7上发布Java GUI应用程序.此应用程序使用Swing Toolkit,不需要任何本机代码.使用NSIS安装程序安装该应用程序.我想尽可能地将此应用程序集成到Windows 7中.这意味着:
WinRun4j是一个启动Java应用程序的EXE文件.因为应用程序没有分叉新的Java进程,Windows认为EXE文件是应用程序.所以任务栏没有问题.文件关联有效,因为文件可以简单地与EXE文件关联.
问题:
Launch4J创建了一个32位EXE,它启动了一个外部Java进程来启动Java应用程序.因此,与WinRun4J不同,它也可以启动64位Java.
问题:
System.out.printlnheaderType="gui"无论是否从控制台启动应用程序,都不会打印到控制台.在Windows上,您只需双击JAR文件即可启动该应用程序.安装JRE并不重要,只是工作.但...
问题:
像这样的简单批处理文件可用于启动应用程序:
@echo off
start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1
Run Code Online (Sandbox Code Playgroud)
可以为此批处理文件创建快捷方式以设置自定义图标.
问题:
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项目中(使用这个或这个插件),配置非常简单,除了任务栏固定外,一切都是开箱即用的.对于任务栏固定,Java应用程序必须按照此问题的答案中的说明设置appModelUserId .
此外,Java应用程序必须由安装程序安装,安装程序必须至少安装一个指向EXE的快捷方式.此快捷方式还必须包含appModelUserId.使用NSIS,可以使用WinShell插件 …
我使用Launch4j作为我在Windows 7下的Java应用程序的包装器,根据我的理解,本质上它的一个实例javaw.exe依次解释Java代码.因此,在尝试将我的应用程序固定到任务栏时,Windows会反而引脚javaw.exe.如果没有所需的命令行,我的应用程序将无法运行.

如您所见,Windows也没有意识到Java是主机应用程序:应用程序本身被描述为"Java(TM)Platform SE binary".
我尝试更改注册表项HKEY_CLASSES_ROOT\Applications\javaw.exe以添加值IsHostApp.这通过完全禁用我的应用程序的固定来改变行为; 显然不是我想要的.

在阅读了Windows如何解释单个应用程序的实例(以及此问题中讨论的现象)之后,我开始对将应用程序用户模型ID(AppUserModelID)嵌入到我的Java应用程序中感兴趣.
我相信我可以通过传递一个独特AppUserModelID的Windows 来解决这个问题.有一种shell32方法,SetCurrentProcessExplicitAppUserModelID.根据Gregory Pakosz的建议,我实现了它,试图将我的应用程序识别为以下单独的实例javaw.exe:
NativeLibrary lib;
try {
lib = NativeLibrary.getInstance("shell32");
} catch (Error e) {
Logger.out.error("Could not load Shell32 library.");
return;
}
Object[] args = { "Vendor.MyJavaApplication" };
String functionName = "SetCurrentProcessExplicitAppUserModelID";
try {
Function function = lib.getFunction(functionName);
int ret = function.invokeInt(args);
if (ret != 0) {
Logger.out.error(function.getName() + " returned error …Run Code Online (Sandbox Code Playgroud) 经过半天的搜索和尝试,我终于放弃了.
我有一个java应用程序,我创建一个可运行的jar(包括任何其他库,只有一个jar文件).使用launch4j和runnable jar我正在创建一个可执行文件"MyApp.exe".
可执行文件工作正常,但我想将它固定到我的Windows 7任务栏.现在,我只有任务栏条目"关闭窗口".
用JNA阅读并实现以下解决方案后
我的应用程序在gui中正确显示它的"应用程序用户模型ID"(仅用于测试目的).
但是:我的程序在任务管理器中显示为"javaw.exe",我仍然无法将其固定到任务栏,即使我设置了launch4j选项"自定义进程名称和XP样式清单".
背景信息:我正在使用Windows 7管理员帐户,我不希望该应用程序需要管理员权限.
无论如何,如果我从上下文菜单中"以管理员身份"启动应用程序并确认UAC消息,我现在可以固定到任务栏.但是:即使我正确设置了"应用程序用户模型ID",Windows仍然希望固定"javaw.exe",即使我的程序现在在TaskManager中显示为"MyApp.exe".
我完全糊涂了.但我显然不是唯一一个有这些问题的人.=>请参阅Gregory Pakosz在使用JNA获取/设置应用程序标识符时的最后评论
最后的问题:
我已经使用这三个开源工具来打包我的java应用程序,但它们现在看起来都像放弃了.这三个都是非常好的软件.现在有哪些选择?(或者使用Java进行桌面应用程序开发不再是应用程序开发人员构建和维护这些工具的"热门"市场吗?).
1)exe包装器:jsmooth - 2.5年内没有新的开发 - 不支持64位.launch4j - 一年多没有新开发,支持64位,但你不能签署launch4j创建的exe,所以我更喜欢jsmooth,但它不支持64位.
2)onejar:它有效,但在超过2.5年内没有新的开发或网站更新.因此,如果突然中断了新的Java构建,只想切换到支持/拥有备份计划的东西.
谢谢埃德加
我是Java编程的新手,但我一般都熟悉一切是如何工作的.我希望能够将jar文件和jre放入windows可执行文件(exe)中,这样当我分发它时,客户端不需要安装JRE.我应该使用什么程序?
我有launch4j,它似乎正是我想要的,但是当我尝试运行应用程序时,我得到"这个应用程序被配置为使用捆绑的Java运行时环境,但运行时丢失或损坏."
我希望我的应用程序只是一个可运行的exe,而不是安装程序.至少,有人能告诉我如何正确地将一个JRE与launch4j捆绑在一起吗?
我注意到Launch4j的GUI似乎更喜欢bmp文件,所以我使用Gimp将我的jpg文件转换为该格式,但是在尝试运行Launch4j生成的可执行文件时我一直收到错误.
我正在尝试将安装程序的生成集成为maven编译过程的一部分.
我找到了Alakai的Launch4j 插件.我使用Maven创建了一个简单的Hello World应用程序.我试图使用Alakai提供的配置示例,但是当我编译项目时,我得到:
无法在项目Launch4j上执行目标org.bluestemsoftware.open.maven.plugin:launch4j-plugin:1.5.0.0:launch4j(launch4j):无法构建可执行文件; 请验证您的配置.应用jar不存在. - > [帮助1]
不幸的是,Alakai的文档是有限的,我用谷歌搜索找不到多少.
谢谢.
我的build.xml中有以下说明,我收到以下异常.
launch4j:net.sf.launch4j.ExecException:执行失败(1):C:\ Program Files\Launch4j\bin\windres.exe --preprocessor = type -J rc -O coff -F pe-i386 C:\ Windows\TEMP\launch4j2603642297702639520rc C:\ Windows\TEMP\launch4j1179691608441365102o
这是我的构建脚本:
<project basedir="." default="build" name="Bienvenue">
<!-- Crée le fichier d'installation BienvenueSetup.exe -->
<target name="build">
<!-- Création du dossier classes -->
<mkdir dir="classes"/>
<!-- Compilation des classes du programme -->
<javac srcdir="src" destdir="classes" />
<!-- Création du dossier install/lib -->
<mkdir dir="install/lib"/>
<!-- Création du fichier Bienvenue.jar -->
<jar destfile="install/lib/Bienvenue.jar" basedir="classes"/>
<!-- Suppression du dossier classes -->
<delete dir="classes"/>
<!-- Copie du JRE dans …Run Code Online (Sandbox Code Playgroud) 我有一个简单的java项目,需要外部jar.我用netbeans构建它,在Clean和Build命令之后,我可以在dist目录中找到以下结构:
-myApp.jar
-lib/
library1.jar
library2.jar
Run Code Online (Sandbox Code Playgroud)
典型的,我会说.
现在,我想将依赖库的myApp.jar作为一个exe分发.这可能吗?我正在尝试使用Launch4J.在GUI中我创建配置文件,在cp部分有一些选项
<cp>lib/swing-layout-1.0.4.jar</cp>
Run Code Online (Sandbox Code Playgroud)
但它似乎是classpath,它是我可以参考我的额外罐子的唯一地方.
创建exe文件后,我在exe中找不到dependend libs(exe可以用winrar打开),因此我的应用程序崩溃了.
我怎样才能使exe文件正确?
谢谢你的帮助.
java ×10
launch4j ×10
exe ×2
jar ×2
taskbar ×2
windows-7 ×2
batch-file ×1
bmp ×1
integration ×1
jna ×1
maven ×1
portability ×1
startup ×1
windows ×1
winrun4j ×1