调用方法时出错.并且无法启动 JVM - 本机包将构建但不会启动 [英] Error invoking method. and Failed to launch JVM - Native Package will build but not launch

查看:31
本文介绍了调用方法时出错.并且无法启动 JVM - 本机包将构建但不会启动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谁能更具体地说明我的问题所在以及如何解决?

我正在跑步:

  • Windows 7
  • Eclipse Mars.2 版本 (4.5.2)

我已经仔细并反复遵循关于 code.makery.ch (code.makery.ch/library/javafx-8-tutorial/part7/) 的 Marco 教程的说明

I've followed the instructions closely and repeatedly for Marco's Tutorial on code.makery.ch (code.makery.ch/library/javafx-8-tutorial/part7/)

我之前部署过这个程序的一个较早的原生包,遇到了一些麻烦,但最终成功添加

I've deployed an earlier native package of this program before, with some trouble, but eventually successfully after adding

-vm
C:\Program Files\Java\jdk1.8.0_91\bin\javaw.exe

到eclipse.ini

to eclipse.ini

最终让ant build成功运行后,

After finally getting the ant build to run successfully,

do-deploy:
        [copy] Copying 2 files to C:\Users\administrator.SUNDANCE\IdeaProjects\POA 1.1 Build Master\POA 1.1 - Try 1\build\dist\libs
       [mkdir] Created dir: C:\Users\administrator.SUNDANCE\IdeaProjects\POA 1.1 Build Master\POA 1.1 - Try 1\build\build\classes\META-INF
Using base JDK at: C:\Program Files\Java\jdk1.8.0_91\jre
Using base JDK at: C:\Program Files\Java\jdk1.8.0_91\jre
Installer (.exe) saved to: C:\Users\administrator.SUNDANCE\IdeaProjects\POA 1.1 Build Master\POA 1.1 - Try 1\build\deploy\bundles
BUILD SUCCESSFUL
Total time: 56 seconds

我的主文件如下所示:

 import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

/**
 * Created by Brad on 5/20/2016.
 * Solely used to load the FXML and set the icons. Everything else is done in Controller.java
 */
public class Main extends Application {
    public static FXMLLoader loader;

    //Icon from https://icons8.com

    @Override
    public void start(Stage primaryStage) throws Exception{
        loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("view/Arrivals_Layout1.fxml"));
        Parent root = loader.load();
        primaryStage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("resources/images/Pallet-96.png")));
        primaryStage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("resources/images/pallet_96_allsizes.ico")));



        primaryStage.setTitle("Purchase Order Arrivals");
        primaryStage.setScene(new Scene(root));
        primaryStage.setMinWidth(820);
        primaryStage.setMinHeight(375);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

我的包资源管理器看起来像这个,如果有帮助的话我的路径:C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\IBM\Client Access\Emulator;C:\Program Files (x86)\IBM\Client Access\Shared;C:\Program Files (x86)\IBM\Client Access\;C:\Program Files\Microsoft SQL Server\110\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\;C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\;C:\Program Files\TortoiseHg\;C:\Program Files (x86)\Inno Setup 5

My Package Explorer looks something like this, if it helps My PATH: C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\IBM\Client Access\Emulator;C:\Program Files (x86)\IBM\Client Access\Shared;C:\Program Files (x86)\IBM\Client Access\;C:\Program Files\Microsoft SQL Server\110\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\;C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\;C:\Program Files\TortoiseHg\;C:\Program Files (x86)\Inno Setup 5

build.xml:

<?xml version="1.0" encoding="UTF-8"?>
    <project name="POA 1.1 - Try 1" default="do-deploy" basedir="."  xmlns:fx="javafx:com.sun.javafx.tools.ant">
    <target name="init-fx-tasks">
        <path id="fxant">
            <filelist>
                <file name="${java.home}\..\lib\ant-javafx.jar"/>
                <file name="${java.home}\lib\jfxrt.jar"/>
                <file name="${basedir}"/>
            </filelist>
        </path>

        <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
            uri="javafx:com.sun.javafx.tools.ant"
            classpathref="fxant"/>
    </target>
    <target name="setup-staging-area">
        <delete dir="externalLibs" />
        <delete dir="project" />
        <delete dir="projectRefs" />

        <mkdir dir="externalLibs" />

        <copy todir="externalLibs">
            <fileset dir="C:\Program Files\Java\sqljdbc_4.2\enu">
                <filename name="sqljdbc42.jar"/>
            </fileset>
        </copy>
        <copy todir="externalLibs">
            <fileset dir="C:\Users\administrator.SUNDANCE\IdeaProjects\POA 1.1 Build Master\POA 1.1 - Try 1\build\dist">
                <filename name="POA 1.1 - Try 1.jar"/>
            </fileset>
        </copy>

        <mkdir dir="project" />
        <copy todir="project">
            <fileset dir="C:\Users\administrator.SUNDANCE\IdeaProjects\POA 1.1 Build Master\POA 1.1 - Try 1">
                <include name="src/**" />
            </fileset>
        </copy>

        <mkdir dir="projectRefs" />
    </target>
    <target name='do-compile'>
        <delete dir="build" />
        <mkdir dir="build/src" />
        <mkdir dir="build/libs" />
        <mkdir dir="build/classes" />

        <!-- Copy project-libs references -->
        <copy todir="build/libs">
            <fileset dir="externalLibs">
                <include name="sqljdbc42.jar"/>
                <include name="POA 1.1 - Try 1.jar"/>
            </fileset>
        </copy>

        <!-- Copy project references -->

        <!-- Copy project sources itself -->
        <copy todir="build/src">
            <fileset dir="project/src">
                <include name="**/*"/>
            </fileset>
        </copy>

        <javac includeantruntime="false" source="1.8" target="1.8" srcdir="build/src" destdir="build/classes" encoding="Cp1252">
            <classpath>
                <fileset dir="build/libs">
                    <include name="*"/>
                </fileset>
            </classpath>
        </javac>

        <!-- Copy over none Java-Files -->
        <copy todir="build/classes">
        <fileset dir="project/src">
            <exclude name="**/*.java"/>
        </fileset>
        </copy>


    </target>
    <target name="do-deploy" depends="setup-staging-area, do-compile, init-fx-tasks">
        <delete file="dist"/>
        <delete file="deploy" />

        <mkdir dir="dist" />
        <mkdir dir="dist/libs" />

        <copy todir="dist/libs">
            <fileset dir="externalLibs">
                <include name="*" />
            </fileset>
        </copy>


        <fx:resources id="appRes">
            <fx:fileset dir="dist" includes="POA 1.1 - Try 1.jar"/>
            <fx:fileset dir="dist" includes="libs/*"/>
            <fx:fileset dir="dist" includes="resources/**"/>
        </fx:resources>

        <fx:application id="fxApplication"
            name="Purchase Order Arrivals"
            mainClass="Main"
            version="1.1"
        />

        <mkdir dir="build/classes/META-INF" />



        <fx:jar destfile="dist/POA 1.1 - Try 1.jar">
            <fx:application refid="fxApplication"/>
            <fileset dir="build/classes">
            </fileset>
            <fx:resources refid="appRes"/>

            <manifest>
                <attribute name="Implementation-Vendor" value="Ugma Development"/>
                <attribute name="Implementation-Title" value="Purchase Order Arrivals"/>
                <attribute name="Implementation-Version" value="1.1"/>
                <attribute name="JavaFX-Feature-Proxy" value="None"/>
            </manifest>
        </fx:jar>


        <mkdir dir="deploy" />
        <!-- Need to use ${basedir} because somehow the ant task is calculating the directory differently -->
        <fx:deploy
            embedJNLP="false"
            extension="false"
            includeDT="false"
            offlineAllowed="true"
            outdir="${basedir}/deploy"
            outfile="POA 1.1 - Try 1" nativeBundles="exe"
            updatemode="background" >

            <fx:platform basedir="${java.home}"/>
            <fx:info title="POA 1.1 - Try 1" vendor="Ugma Development"/>

            <fx:application refId="fxApplication"/>
            <fx:resources refid="appRes"/>
        </fx:deploy>


    </target>
</project>

生成 .exe 并将程序安装在/AppData 中.

The .exe is generated and installs the program in /AppData.

该程序将在 Eclipse 中编译并运行良好,但是当我运行已安装的版本时,我得到:

The program will compile and run fine in Eclipse, but when I run the installed version, I get:

调用方法时出错.

首先,然后点击确定

无法启动 JVM

我似乎什么都试过了:

我已经阅读了多个类似的问题,并在互联网上搜索过,但还没有解决这个问题.我读过的许多答案含糊不清或没有答案的例子:

I've read multiple similar questions, and have scoured the internet, but have yet to vault this problem. Examples of the many I've read with vague or no answers:

javafx原生包错误调用方法

因为部署不精通,Marco 自己说要来问一下 Stack Exchange 的强大世界:http://code.makery.ch/library/javafx-8-tutorial/part7/#comment-2233862311

Because he is less masterful in deployment, Marco himself said to come ask the mighty world of Stack Exchange: http://code.makery.ch/library/javafx-8-tutorial/part7/#comment-2233862311

再次说明我的问题出在哪里以及如何解决?

推荐答案

我想通了!

在两次、三次检查依赖项并看到它编译然后构建正常后,我怀疑位于 build/deploy/{yourProjectName}.jar

After double, triple checking the dependencies and seeing that it both compiled and then built fine, I suspected the jar file which is located at build/deploy/{yourProjectName}.jar

如果您仅在安装后才收到错误,则在安装目录中运行 jar 是有意义的.( AppData/Local/{ApplicationTitle}/app/{yourProjectName}.jar )

If you're getting the errors only once it is installed, it makes sense to run the jar in the installation directory. ( AppData/Local/{ApplicationTitle}/app/{yourProjectName}.jar )

我在命令行上运行它以查看它是否抛出异常:

I ran it on the command line to see if it was throwing an exception:

为了轻松导航到我在资源管理器中保存项目的目录,然后将其复制到命令行.

To easily navigate to the directory I noted where I had saved my project in Explorer and then copied that to the command line.

  1. 打开命令提示符

  1. Open command prompt

Win + r

cmd + 回车

导航到目录

cd {ProjectPath}\build\deploy

运行jar文件

java -jar "{YourJar}.jar"

因为我通过命令提示符执行了 jar,所以 java 有地方向我展示异常!

Because I executed the jar via the command prompt, java had somewhere to show me the exception!

C:\Users\administrator.SUNDANCE\IdeaProjects\PODTester_Layout8\build\deploy>java
 -jar "PODTester_Layout8.jar"
java.io.FileNotFoundException: src\resources\Carrier List.txt (The system cannot
 find the path specified)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileReader.<init>(Unknown Source)

在查看我的代码时,我认为它没有找到该文件,因为显式引用了 src.我修好了,瞧!重建后,安装的应用程序工作!

Upon reviewing my code, I figured that it wasn't finding the file because of the explicit reference to src. I fixed that and lo and behold! Upon rebuilding, the installed application worked!

如果你的原生包给你一个

调用方法时出错.

和一个

无法启动 JVM

通过命令提示符运行你的 jar 文件,看看它是否抛出异常.

现在,如果您想了解有关我的具体问题以及我修复它的过程的详细信息,请访问:

Now if you want details about my specific problem and the process I went through to fix it, here you go:

我认为这可能与依赖项有关(尤其是我包括 sqljdbc 驱动程序),但事实证明这不是依赖项问题.问题在于.jar 仅在安装后 引发异常. 使错误如此难以理解的是非常通用的无法调用方法."这给了我很少的新信息.

I thought it might've been something to do with dependencies (especially with me including the sqljdbc driver), but it turns out it wasn't a dependency issue. The problem was that the .jar was throwing an exception only once installed. What made the error so hard to understand was the oh-so-generic "Could not invoke method." which gave me little new information.

为了减轻未来的类似问题,我添加了一个 showExceptionDialog() 方法(灵感来自 Marco Jacob 的作品) :

To mitigate future similar problems I added a showExceptionDialog() method (inspired by Marco Jacob's work) :

/**
 * Shows a dialog box when an exception occurs instead of just doing nothing.
 *
 * Once installed this will help to diagnose problems instead of letting
 * them go unnoticed.
 *
 * @param e the exception to print; it's stacktrace will be shown as well
 */
public static void showExceptionDialog(Exception e) {
    Alert alert = new Alert(Alert.AlertType.ERROR);

    alert.setTitle("Exception Dialog");
    alert.setHeaderText("An error occurred:");

    String content = "Error: ";
    if (null != e) {
        content += e.toString() + "\n\n";
    }

    alert.setContentText(content);

    Exception ex = new Exception(e);

    //Create expandable Exception.
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    ex.printStackTrace(pw);

    String exceptionText = sw.toString();

    //Set up TextArea
    TextArea textArea = new TextArea(exceptionText);
    textArea.setEditable(false);
    textArea.setWrapText(true);


    textArea.setPrefHeight(600);
    textArea.setPrefWidth(800);


    //Set expandable Exception into the dialog pane.
    alert.getDialogPane().setExpandableContent(textArea);


    alert.showAndWait();
}

<小时>

关于我的问题的具体细节:

在我的程序中,我有一个名为 Carrier List.txt 的文件被读取和写入,它存储在 resources 文件夹中.


Specific details about my problem:

In my program I had a file called Carrier List.txt being read and written to, and it was stored in the resources folder.

在 IntelliJ 和 Eclipse 中它编译得很好,因为它可以找到 src/resources/Carrier List.txt 很好.当我按照 Marco Jacob's 手动复制资源文件夹时,事情会很好部署教程,但我明确引用了

In IntelliJ and Eclipse it compiled just fine because it could find src/resources/Carrier List.txt just fine. Things would have been just fine when I manually copied the resources folder as per Marco Jacob's Deployment Tutorial, but I explicitly referenced

src/resources/Carrier List.txt

src/resources/Carrier List.txt

在我的代码中,而不仅仅是

in my code instead of just

资源/运营商列表.txt

resources/Carrier List.txt


这篇关于调用方法时出错.并且无法启动 JVM - 本机包将构建但不会启动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆