3

我编写了一个 Java 应用程序,我想为主要操作系统打包,以便我可以将它作为一个独立的可安装映像提供。为此,我使用 jpackage,并借助我遇到的最有名的插件 The Badass Runtime Plugin ( https://badass-runtime-plugin.beryx.org )

我的问题是,尽管打包有效,但与已编译的 Java 相比,打包的应用程序的性能很糟糕。

当我在 MacOS 上构建我的应用程序(我为此使用 gradle)时,构建输出包括一个包含已编译类和启动脚本的安装目录,以及一个包含应用程序文件的 dmg 的安装程序目录。

通过启动脚本从编译的类运行应用程序效果很好。从应用程序运行应用程序(从 dmg 安装后)非常慢 - 通常是 10 倍甚至更糟。

已编译类的启动脚本指向我的本地 JDK 实例 (openjdk 16),而应用程序文件包含应用程序运行所需的 jdk 模块。这当然是设计使然,但我能想到的两者之间的唯一区别。

感谢您阅读本文 - 我意识到这是一个相当小众的问题。如果有人有任何可能有帮助的经验或想法,我很乐意听到。

谢谢,安迪

编辑 9 月 10 日 - 感谢迄今为止所有的兴趣和评论。关于我的应用程序的更多注释可能相关:

它是 RocksDB 的重度用户,用于堆外、文件支持的数据存储。编译后的 Java 和打包的 app 都使用相同的 sst 文件,所以数据是相同的。应用程序和数据在同一台机器上运行/存在,一台带有 SSD 驱动器和充足容量的 MacBook Pro。

它启动 Javalin 实例来为基于浏览器的 UI 启动 https 连接并接受数据请求。

4

1 回答 1

0

我确实遇到了同样的问题,不知何故 jpackage 制作的二进制文件太慢了,在调整二进制文件的创建时没有找到任何解决方案,所以我最终用启动 jar 的 sh 替换它,这使得应用程序正常工作.

因此,在 /Contents/app 中创建 app-image 后,将二进制文件替换为

#!/bin/bash
$DIR/../runtime/Contents/Home/bin/java -Xdock:icon=$DIR/../Resources/icon.icns -Djava.library.path=$DIR:$DIR/../MacOS -Djava.launcher.path=$DIR/../MacOS -Dapp.preferences.id=org/springframework/boot/loader -Dstorage.diskCache.bufferSize=200 -Xmx4g -cp $DIR/../app/server.jar org.springframework.boot.loader.JarLauncher
于 2021-11-25T12:33:47.113 回答