java - 如何将动态 JVM 命令行标志传递给独立的 JavaFX 应用程序?

标签 java deployment javafx jvm

编辑:Oracle 接受我请求增强的错误报告 JDK-8138944 : Support command line arguments to the JVM passed to self-contained app launchers .

问题

我的团队正在开发一个开源 Java SE 项目,ImageJ , 目前有一个 custom native launcher用跨平台 C 编写。我们想摆脱这个启动器,切换到更现代、行业标准和可维护的部署机制。 JavaFX self-contained applications是迄今为止我们发现的最有希望的解决方案。

ImageJ 当前的 native 启动器的一个重要功能是它能够自定义 JVM 的启动方式。例如,你可以这样写:

ImageJ --debugger=8000 myFile.png

启动器将使用标志调用 JVM:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:8000

同时保留 myFile.png 作为 Java 主类的参数。

但是从文档中,我们看不到使用 JavaFX 打包工具完成类似事情的方法。

注意事项

我知道 UserJvmOptionsService提供了一种配置 JVM 启动方式的方法(通过内部的 Java Preferences API,JavaFX 启动程序在 JVM 启动之前读取它)。这非常适合为用户提供一个友好的对话框,他们可以在其中调整最大堆大小和其他常用参数。当然,我们可以向此类对话框添加远程调试开关和端口设置,和/或通过 CLI 支持 JVM 配置——但这需要重新启动应用程序。

理想情况下,我们根本不需要支持这种情况,而是在 JVM 启动后用 Java 处理所有命令行参数。例如,在大多数情况下,可以通过简单地解析 arg 并在运行时设置系统属性来支持 -Dfoo=bar 形式的系统属性,只要在应用程序的早期完成即可启动周期。但是显然有很多情况是在 JVM 启动之后再做为时已晚:

我们的用户希望能够在 CLI 上传递这些设置,并让 Java 运行时相应地运行——对于 ImageJ,这对于向后兼容性尤为重要。

可能的解决方案

  • 我们可以保留 native C 启动程序,替换 Java 打包工具安装的 native 可执行文件。但这让我觉得非常脆弱,并且在很大程度上违背了切换到 JavaFX 部署的目的,因为我们仍然需要跨多个不同平台维护、构建和测试自定义 native 启动器。

  • 或者,我们可以让应用程序主类成为一个非常精简的 CLI 选项解析器,然后生成 JVM 的第二个实例。这将使引导逻辑保持在纯 Java 中,这比当前的 native C 代码更易于维护,同时充分利用 JavaFX 部署方案的跨平台捆绑功能。但这似乎是一个具有潜在挑战性副作用的大黑客。

最后是问题

是否有人通过 JavaFX 自包含应用程序部署实现了对 JVM CLI 参数的支持?如果是,您是如何实现的?如果没有,还有其他建议吗?

最佳答案

您可以通过修改 API 写入的 jvm 用户覆盖配置文件来修改 JVM 的启动参数:

• Mac ~/Library/Application Support/[app.preferences.id]/packager/jvmuserargs.cfg • Windows C:\Users[用户名]\AppData\Roaming[app.preferences.id]\packager\jvmuserargs.cfg • Linux ~/.local/[app.preferences.id]/packager/jvmuserargs.cfg

注意:这是一个内部实现细节,可能会发生变化。

关于java - 如何将动态 JVM 命令行标志传递给独立的 JavaFX 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30809330/

相关文章:

java - 在java中解析html以提取信息

java - 如何在不使消息出队的情况下浏览rabbitmq中的队列

java - REST 服务发送损坏的文件

deployment - ReplicaSet 和 ReplicationController 有什么区别?

在 IBM Websphere 7 集群中部署具有高可用性的节点

JavaFX 容器可拖动

java - 如何在 JavaFX Cell 中绑定(bind)数据

java - 通过 Java API 将具有值的字段添加到 MongoDB 中的现有文档

azure - 检查 CI/CD 管道中 Kubernetes 部署是否成功

Javafx如何从 Controller 类关闭场景