【问题标题】:Error invoking method, failed to launch jvm调用方法时出错,无法启动 jvm
【发布时间】:2015-10-22 15:43:09
【问题描述】:

我正在使用 javafx v8.0.40 开发一个桌面应用程序。我用inno 5创建了一个exe文件。当我在我的电脑上运行exe文件时,它安装并运行没有任何问题。另一方面,当我尝试在其他计算机上安装并运行它时,在安装结束时,弹出窗口对话框:“错误调用方法”,我单击确定。另一个窗口弹出“无法启动 jvm”。我搜索了整个互联网,但我找不到太多关于这个主题的信息。我希望我能解决这个问题。 提前谢谢你。

【问题讨论】:

标签: javafx javafx-8


【解决方案1】:

我遇到了同样的问题;以下内容对我有用,并帮助我理解了那些被抨击的“错误调用方法”。和“无法启动 JVM”对话框:

  1. 找到您的.jar 文件
    • 它与您的项目同名,位于应用程序的安装目录AppData\Local\{ApplicationTitle}\app 下(快捷方式:在资源管理器中键入 %appdata%);如果您的项目名为 HelloWorld,您将在此处找到 HelloWorld.jar
  2. 在命令提示符下导航到它的目录
    • shift+右键单击资源管理器窗口中的任何空白处并选择“在此处打开命令窗口”(这是我最近学到的一个花哨的技巧;alternatively you would cd使用命令提示符在同一目录)
  3. 通过命令行运行.jar
    • 输入java -jar "HelloWorld.jar"并点击Enter

Tadah! 看看你隐藏的异常(其中“错误调用方法”的存在。如此模糊地试图与你交流)。 *

如果您的问题与mine 类似,则它源于项目out 文件夹和安装目录之间的文件结构差异,这就是程序在编辑器中编译得很好并且构建得很好的原因——没有'在构建完成之前不是问题,而且文件结构有点不同。

*如果您在通过命令行运行它时没有得到任何东西,请查找在该 initialize() 方法期间可能发生的任何错误;这就是您的问题所在。 您可以在运行时使用弹出异常对话框(如a similar problem, here 所示)公开任何异常。

【讨论】:

  • 遇到了类似的问题,但使用的是第 3 方应用程序。这个答案为我指明了正确的方向。看起来代码不尊重 %appdata% 变量。我将它重新安装到一个具有固定名称的目录中,这在 Windows 的所有语言变体中都是相同的(在我的情况下为C:\Users\user),异常消失了。
【解决方案2】:

这可能是因为它缺少输出 jar 中的依赖项。所以你需要在工件中添加库,然后生成.exe就可以了。

这是一个使用 Intellij 的示例,其中库已手动从“可用元素”移动到工件

Intellij example

【讨论】:

    【解决方案3】:

    即使这个问题有点老了 - 今天我遇到了完全相同的问题,除了这里之外找不到任何解决方案来搜索这些错误消息。

    问题几乎相同: 使用 java 8 构建 JavaFX 应用程序(在 dev pc 上运行良好)并使用 Inno 5 打包到本机安装程序(exe)。 应用程序在我们的一些机器上运行良好 - 在其他机器上它失败并显示错误消息:

    • “错误调用方法” 并点击确定后
    • “无法启动 jvm”。

    在应用程序启动时,fxml 加载器加载第一个视图控制器并调用其“初始化”方法。如果 - 在初始化过程中 - 抛出未处理的异常,应用程序崩溃并显示这两个窗口错误消息。

    希望这会帮助像我一样也在为此苦苦挣扎的人。

    【讨论】:

      【解决方案4】:

      J.Dürr 的回复(2016 年 6 月 8 日 9:58 回答)帮助解决了我的错误调用方法无法启动 JVM 问题。我使用以下代码来追踪问题,结果发现是错误的 FXML 资源路径:

      public static void main(final String[] taArgs)
      {
        try
        {
          Main.launch(taArgs);
        }
        catch (Exception e)
        {
          JOptionPane.showMessageDialog(null, e.getMessage());
          try
          {
            PrintWriter pw = new PrintWriter(new File("<somefilename.txt>"));
            e.printStackTrace(pw);
            pw.close();
          }
          catch (IOException e1)
          {
            e1.printStackTrace();
          }
        }
      }
      

      【讨论】:

        【解决方案5】:

        我刚遇到这个问题,@Brad Turek 的回答为我指明了正确的方向。除了不是我的代码引发了异常。

        .exe 包装器用于启动我的应用程序的 .cfg 文件(位于 /&lt;app_name&gt;/app/&lt;app_name&gt;.cfg)错误地指向 /lib 目录中不存在的库(jar 文件)。哪个(我得出结论)导致类加载器抛出并终止启动。

        更正 .cfg 文件后一切正常。

        【讨论】:

          【解决方案6】:

          我无法解决问题,但我找到了解决方法。我使用记事本创建了一个批处理文件来启动应用程序。首先我使用cd 进入.jar 文件的目录,然后使用java -jar 启动应用程序。它应该看起来像这样:

          cd C:\[wherever your project folder is located]\[name of project]\dist
          java -jar [name of project].jar
          

          将其保存为桌面上的.bat 文件,启动批处理文件,您的程序将启动!

          【讨论】:

            【解决方案7】:

            如果您没有在构建中包含第三方库,您可能会遇到此错误。

            以下内容可以放在build.xml中项目的结束标签之前。

            <target name="-post-jfx-deploy">
                <fx:deploy width="${javafx.run.width}" height="${javafx.run.height}" nativeBundles="all"
                           outdir="${basedir}/${dist.dir}" outfile="${application.title}">
                    <fx:application name="${application.title}" mainClass="${javafx.main.class}"/>
                    <fx:resources>
                        <fx:fileset dir="${basedir}/${dist.dir}" includes="*.jar"/>       
                        <fx:fileset dir="${basedir}/${dist.dir}" includes="lib/*.jar"/>
                    </fx:resources>
                    <fx:info title="${application.title}" vendor="${application.vendor}"/>
                </fx:deploy>           
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-09-07
              • 1970-01-01
              • 2022-01-05
              • 1970-01-01
              • 1970-01-01
              • 2014-06-01
              • 1970-01-01
              相关资源
              最近更新 更多