Skip to content

Instantly share code, notes, and snippets.

@KnIfER
Last active June 29, 2026 07:11
Show Gist options
  • Select an option

  • Save KnIfER/39fb0b9c82f451837048aeca441b3762 to your computer and use it in GitHub Desktop.

Select an option

Save KnIfER/39fb0b9c82f451837048aeca441b3762 to your computer and use it in GitHub Desktop.
让Java再次伟大

让Java再次伟大,没有人比我更懂得如何打包!(分享一个四两拨千斤的多jar打包exe方式)

Java 确实是内存不高效的。同样的内存,fultter / dart 能够创建流畅的应用,而Java要么卡成ppt,要么疯狂吃内存。

测试一个虚拟机内存回收效率的方法:win下使用 procgov 假装本机只有 100 mb内存,再运行 gui 程序,测试卡不卡。

结果,javafx 卡成 ppt,flutter 写的桌面app却依然流畅,几乎没有卡顿!(例子:dart写的myune_music存在严重的内存泄漏,稍微切歌内存狂飙300mb+,然后限制100mb后仍然流畅,神奇吧!)

这说明 flutter / dart 的虚拟机比 java 更高级。人才不断涌入新的领域,Java8 已经成熟到可以封印起来装裱,成熟到可以使用一万年,新的改进似乎九牛一毛。

但当我从 64 位的java8切换到 32位的java8,内存需求立马减半 —— 即使限制 100mb 内存,也没有那么卡了。

这给我一点信心。我还是很喜欢 javafx。也曾升级到新的 open jdk,打包方式太复杂,反人类,而且几乎没有区别,尤其是浏览器内核,根本没人在开发新的jvm,都是语法糖而已。所以又回到 java8 并锁死。

那么,如何打包分享给其他用户呢?

搜遍全网,似乎没有好的方案?

  • Launch4j : 提供把单个 jar 追加到预制的启动器后面的 blacksmith。
  • jsmooth : 可以更方便地添加多个 jar 作为启动参数。

这些方案的本质是启动器。因为java程序的本质就是调用上位开发者提供的虚拟机.exe 运行编译后的字节码。

那我自己写个启动器好了!

先说我自己如何使用的:使用idea编译后,写个 bat 调用 java.exe 运行编译好的 class。

那么我的启动器就可以封装这条启动指令。并在没有jvm的时候,提供下载链接。

交给deepseek吧!

提示词:

ahk v1 写个 jar 启动器,蓝色背景。寻找符合条件的 java.exe (java 8),启动指令固定:java.exe -classpath "target\classes;libs/;MIJI/joni/" com.knziha.plod.plaindict.javafx.PlainDictionaryPcJFX

需要启动器GUI:一个输入框,可以填写 jre 路径或 java.exe 路径。旁边一个按钮可打开系统文件选择器。

下一行显示超链接 - 网盘下载 jre

下一行显示 - 调用浏览器网络搜素: jre-8u211-windows-i586.exe 镜像

上面三行用好看的组合框框起来。

底部左边一个优美的按钮“保存为快捷方式”,右边一个好看的启动按钮。

结果:

image

甚至还能有圆角版本的:

image

AHK 寻找 jvm 的代码十分简洁,涵盖注册表与环境变量:

FindJRE() {
    ; 从注册表查找 (补充)
    RegRead, jrePath, HKLM, SOFTWARE\JavaSoft\Java Runtime Environment, CurrentVersion
    if (jrePath != "") {
        RegRead, jreHome, HKLM, SOFTWARE\JavaSoft\Java Runtime Environment\%jrePath%, JavaHome
        if (jreHome != "") {
            exePath := jreHome . "\bin\javaw.exe"
            if (FileExist(exePath))
                return exePath
        }
    }
	
	
    ; 从 JAVA_HOME 环境变量查找
    EnvGet, javaHome, JAVA_HOME
    if (javaHome != "") {
        jrePath := javaHome . "\bin\javaw.exe"
        if (FileExist(jrePath))
            return jrePath
        jrePath := javaHome . "\jre\bin\javaw.exe"
        if (FileExist(jrePath))
            return jrePath
    }
    
    ; 从 C 盘安装目录查找
    paths := ["C:\Program Files\Java\jre*\bin\javaw.exe", "C:\Program Files (x86)\Java\jre*\bin\javaw.exe"]
    for _, path in paths {
        Loop, %path%
        {
            if (FileExist(A_LoopFileFullPath))
                return A_LoopFileFullPath
        }
    }
    return ""
}

成功启动后,可以点击“保存快捷方式”按钮,就能直接运行 javaw.exe,不再需要启动器,干掉中间层!

这一招帅不帅,别人还在研究怎么使用第三方预制的启动器.exe,我已经干掉启动器了,启动器就是个跳板,可以直接使用快捷方式.lnk的。

image
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment