deployment - 无法在 JAR 中使用外部库部署 JavaFX 应用程序

标签 deployment ant jar javafx-2

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

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

  1. 通过 ANT 脚本构建 JavaFX 应用程序,下面是构建脚本相关部分的片段

    <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( native 方法) 在 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。 java :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. java :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)

最佳答案

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

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

  2. 创建一个createjar 文件夹,并在其中创建一个classes 和一个out 文件夹。将所有 .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 的机器上运行。

关于deployment - 无法在 JAR 中使用外部库部署 JavaFX 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18815835/

相关文章:

node.js - 在向另一个 Heroku 应用程序发出 HTTP 请求后,Heroku 使用 SIGTERM 停止所有进程

java - Tomcat - 多个 webapps 文件夹

spring - 无法激活 SimpleNamingContextBuilder : there is already a JNDI provider registered

django - 基于 Dokku 的安装中我的静态文件在哪里?

java - 为用户更新 Java Applet

ant - build.xml将日期和时间设置为文件名

java - Ant+Junit 在第一次运行时有效,再也不会运行

java - 分发 Java LWJGL 程序

Java:我自己的 MANIFEST.MF 文件在 maven 构建的 jar 中不生效

java - Android 存档库 (aar) 与标准 jar