【问题标题】:Unable to deploy JavaFX applicaiton with external libraries in a JAR无法使用 JAR 中的外部库部署 JavaFX 应用程序
【发布时间】:2013-09-19 21:12:46
【问题描述】:

我正在 Eclipse 中开发 JavaFX 应用程序。该应用程序具有外部库,例如 log4j 和其他库,并且可以从 Eclipse 完美运行。我尝试通过 Eclipse 内置功能将它从 Eclipse 部署为 Runnable jar,它在某些计算机上运行良好,而在其他计算机上它会给我一个模糊的未定义链接错误。经过深入研究,JavaFX 似乎需要通过 ANT 脚本或javafxpackager 应用程序进行特殊打包。

在我的一生中,我似乎无法通过这两种方法部署可运行的 jar。尝试其中任何一种方法,我都会得到一个异常。我尝试过的事情:

  1. 通过一个ANT脚本构建JavaFX应用,下面是构建脚本相关部分的sn-p

    <path id="classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
        <fileset dir="${javafx.sdk.path}/jre/lib" includes="jfxrt.jar"/>
    </path>
    
    <target name="compile" depends="clean">
        <echo>Compiling the source</echo>  
        <mkdir dir="${classes.dir}"/>
        <!-- Copy over the misc files into the classes dir -->
        <copy todir="${classes.dir}/bundles">
           <fileset dir="${src.dir}/bundles"/>
        </copy>
        <copy todir="${classes.dir}/css">
            <fileset dir="${src.dir}/css"/>
        </copy>
        <copy todir="${classes.dir}/img">
           <fileset dir="${src.dir}/img"/>
        </copy>
        <copy todir="${classes.dir}/views">
           <fileset dir="${src.dir}/views"/>
        </copy>
    
        <copy todir="${classes.dir}/bundles">
           <fileset dir="${src.dir}/bundles"/>
        </copy>
    
        <copy file="${src.dir}/log4j2.xml" todir="${classes.dir}"/>
    
        <javac target="1.7" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" debug="on">
        </javac>
    </target>
    
    <target name="jar" depends="compile">
        <echo>Creating the main jar file</echo>  
        <mkdir dir="${distro.dir}" />
        <fx:jar destfile="${distro.dir}/main.jar" verbose="true">
            <fx:platform javafx="2.1+" j2se="7.0"/>
            <fx:application mainClass="${main.class}"/>
    
            <!-- What to include into result jar file?
                 Everything in the build tree-->
            <fileset dir="${classes.dir}"/>
    
            <!-- Define what auxilary resources are needed
                  These files will go into the manifest file,
                  where the classpath is defined -->
             <fx:resources>
                <fx:fileset dir="${distro.dir}" includes="main.jar"/>
                <fx:fileset dir="." includes="${lib.dir}/**" type="jar"/>
                <fx:fileset dir="." includes="."/>
            </fx:resources>
    
            <!-- Make some updates to the Manifest file -->
            <manifest>
               <attribute name="Implementation-Vendor" value="${app.vendor}"/>
               <attribute name="Implementation-Title" value="${app.name}"/>
               <attribute name="Class-Path" value="${lib.dir}"/> 
               <attribute name="Implementation-Version" value="1.0"/>
            </manifest>
        </fx:jar>
    </target>
    

通过ant脚本编译/生成jar,我在控制台中弹出一个窗口半秒钟和“应用程序启动方法中的异常”,没有堆栈跟踪。我试过用-XX:-OmitStackTraceInFastThrow 标志运行java,但它仍然不会给我一个堆栈跟踪。

  1. 通过javafxpackager 运行会出现以下错误:

    RenderJob.run:内部异常 java.lang.UnsatisfiedLinkError: com.sun.prism.d3d.D3DContext.nSetBlendEnabled(JZ Z)I 在 com.sun.prism.d3d.D3DContext.nSetBlendEnabled(本机方法) 在 com.sun.prism.d3d.D3DContext.initState(D3DContext.java:84) 在 com.sun.prism.d3d.D3DResourceFactory.(D3DResourceFactory.java:5 7) 在 com.sun.prism.d3d.D3DPipeline.createResourceFactory(D3DPipeline.java: 147) 在 com.sun.prism.d3d.D3DPipeline.getD3DResourceFactory(D3DPipeline.java: 153) 在 com.sun.prism.d3d.D3DPipeline.findDefaultResourceFactory(D3DPipeline。 爪哇:179) 在 com.sun.prism.d3d.D3DPipeline.getDefaultResourceFactory(D3DPipeline.j 艾娃:201) 在 com.sun.prism.GraphicsPipeline.getDefaultResourceFactory(GraphicsPipe 线.java:97) 在 com.sun.javafx.tk.quantum.QuantumRenderer$3.run(QuantumRenderer.java: 143) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:47 1) 在 java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) 在 com.sun.prism.render.RenderJob.run(RenderJob.java:37) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor. 爪哇:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor .java:615) 在 com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Quantu mRenderer.java:98) 在 java.lang.Thread.run(Thread.java:724)

【问题讨论】:

    标签: deployment ant jar javafx-2


    【解决方案1】:

    您可以使用javafxpackager 部署您的应用程序。如果您部署自包含应用程序,Java 运行时环境将与您的应用程序捆绑在一起,并且无论是否安装了正确版本的 Java,它都可以在任何机器上运行。 (你应该在 bin 文件夹下的 jdk 目录中有 javafxpackager

    1. 在 Eclipse 工作区文件夹中查找已编译的文件 (.class)。它们应该在 bin 目录中。

    2. 创建一个createjar 文件夹,并在其中创建一个classes 和一个out 文件夹。复制 classes 文件夹中的所有 .class 文件。还要在 classes 文件夹中包含您的应用程序所需的所有 jar。

    3. 现在在命令行进入createjar 目录并运行以下命令:

      "C:\path\to\jdk\jdk1.7.0_25\bin\javafxpackager.exe" -createjar -appclass package.MainClass -srcdir classes -outdir out -outfile NameOfYourJar -classpath "" -v

    这应该会在out 目录中创建一个可运行的 jar。下一步将需要它。

    1. 现在在createjar 文件夹旁边创建一个deploy 文件夹。

    2. deploy 文件夹内制作到其他目录distpackages

    3. dist 文件夹中,从上面复制您新创建的 jar 以及它需要的所有依赖项/资源。

    返回命令行(如果您曾经离开过)并进入deploy 目录。从那里运行以下命令:

    "C:\path\to\jdk\jdk1.7.0_25\bin\javafxpackager.exe" -deploy -native -outdir packages -outfile NameOfYourApp -srcdir dist -srcfiles NameOfYourJar.jar -appclass package.MainClass -name "Name of You Application" -title "Title of your application"
    

    完成后它应该已经创建了部署应用程序所需的一切,包括在 Windows 平台上运行的原生 .exe 文件。这是独立的应用程序!为了能够运行它,您需要进入 bundles\NameOfYourApp\app 并在此处粘贴您的应用所需的所有依赖项/资源。

    最后,双击 YourApp.exe,它甚至可以在没有安装 Java 的机器上运行。

    【讨论】:

      【解决方案2】:

      对于 ant 文件,您有两个主要选项:&lt;fx:jar&gt;&lt;fx:deploy&gt;。前者只生成一个 jar,如果它们与 jar 位于同一文件中,则允许您引用依赖项。您可以解压 jar 并查看生成的 MANIFEST 文件以了解它们是如何添加到 javafx 类路径中的。

      &lt;fx:deploy&gt; 允许您引入依赖项,但要求您构建特定于平台的安装程序。它不能使用罐子来完成。显然,NetBeans 允许您创建一个独立的 jar,但我没有对此进行测试。

      【讨论】:

        【解决方案3】:
        1. 您没有将 javafxrt.jar 与您的应用一起打包
        2. 如果您使用 e(fx)clipse,它会为您生成 ant 脚本

        【讨论】:

        • 1. javafxrt 不是捆绑在较新的 JRE 中吗? 2.我尝试过使用e(fx)clipse生成的ANT脚本,但没有成功。
        • 捆绑是的,但它不在类路径上,因此 javafxpackager 将一个主类添加到您的 MANIFEST.MF 中,它确实找到它并构造一个专门的类加载器 - 在 Java8 中它位于扩展类路径和这个黑客不再需要了
        猜你喜欢
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 2012-11-16
        • 2014-12-20
        • 1970-01-01
        • 2021-02-25
        • 1970-01-01
        • 2018-04-25
        相关资源
        最近更新 更多