在 JVM 上设置默认参数

Posted

技术标签:

【中文标题】在 JVM 上设置默认参数【英文标题】:Setting default arguments on JVM 【发布时间】:2018-07-02 09:32:57 【问题描述】:

我正在为嵌入式系统开发 javafx 应用程序。 (WIN 7 EMB, JAVA 8)

本系统为触控式(无键盘)但JVM默认未设置虚拟键盘

如何在 JVM 上设置一次并明确地设置这个参数?

-Dcom.sun.javafx.isEmbedded=true
-Dcom.sun.javafx.touch=true
-Dcom.sun.javafx.virtualKeyboard=javafx

感谢您的帮助!

【问题讨论】:

见:***.com/questions/1754077/… Ty mate...但是我在发布之前已经进行了搜索....这个解决方案不起作用!我可能会使用外部启动器解决这个问题... 你能确认 main 方法确实被调用了吗? IIRC 在某些情况下,如果主类扩展 Application,JVM 可能会跳过 main 方法。参见例如docs.oracle.com/javase/8/javafx/get-started-tutorial/…(图 3-1 之前的最后一个项目符号)和 docs.oracle.com/javase/9/tools/java.htm#JSWOR624(在“描述”下) 确认,我通过包装我的主要找到了解决方案,我将自己发布解决方案 这是一个假的,已经找到的解决方案在 IDE (eclipse) 中运行良好,但不适用于 jar 可执行文件 【参考方案1】:

在调用 Application.launch(...) 之前,JavaFX 不会初始化。 您应该尝试设置系统属性,例如,在您的 main(String[] args) 方法中:

public static void main(String[] args) 
    System.setProperty("com.sun.javafx.isEmbedded", "true");
    System.setProperty("com.sun.javafx.touch", "true");
    System.setProperty("com.sun.javafx.virtualKeyboard", "true");
    launch(args); // launch JavaFX

【讨论】:

嗨 turikhay,对不起,但不能在 java 8 上工作,我不确定,但我认为因为 jvm 在启动 main 之前需要这个参数.....这是我的主要 -> 它不工作 public static void main(String[] args) System.setProperty("com.sun.javafx.isEmbedded", "true"); System.setProperty("com.sun.javafx.touch", "true"); System.setProperty("com.sun.javafx.virtualKeyboard", "true");启动(参数); 它有!只是我需要 2 个 main 让它正常工作......一个用于在设置 JVM 设置后启动第二个 main【参考方案2】:

最后,我找到了一个类似的解决方案,在启动我原来的 main 之前,将我的 main 包装在另一个设置 jvm prop 的方法中

 package launcher;

import application.Main;

public class myLauncher 

    public static void main(String[] args) 


        Main.main(null);

    


这是主要的

public static void main(String[] args) 
            System.setProperty("com.sun.javafx.isEmbedded", "true");
            System.setProperty("com.sun.javafx.touch", "true");
            System.setProperty("com.sun.javafx.virtualKeyboard", "javafx");
            launch(args);
            

(在 jar 导出工作时需要标记 ->“在生成的 jar 中提取所需的库”!)

很抱歉,我对此解决方案没有明确的解释!

【讨论】:

真的需要通过反射找到方法吗?似乎过于复杂且容易出错,尤其是因为该类是硬编码的。为什么不直接打电话给application.Main.main(arguments) 这是个好主意,无论如何我还有另一个问题...虚拟键盘可以通过 IDE 很好地启动,但不能从 jar......这令人沮丧... 另一个更新:通过提示启动应用程序后,我已经拦截了此异常-->images/vk-light.png 线程“JavaFX 应用程序线程”java.lang.NullPointerException 中的异常:图像不能为空--> 好像没有找到虚拟键盘的图像 最后,使用“在生成的 jar 中提取所需的库”标志它可以工作!我将再花 1 天的时间进行测试并将重构这篇文章......我认为 jvm 在解决虚拟键盘 imgs 的 uri 时遇到了问题(但我不确定)

以上是关于在 JVM 上设置默认参数的主要内容,如果未能解决你的问题,请参考以下文章

jvm参数设置

jvm内存调优参数详解,附RocketMQ默认内存调优设置

Java JVM 参数设置大全

Java JVM 参数设置大全

如何设置jvm启动参数

jvm的那些设置参数你都知道吗