无法在JAR中部署带有外部库的JavaFX应用程序

时间:2013-09-15 18:20:18

标签: deployment ant jar javafx-2

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

对于我的生活,我似乎无法通过这两种方法部署一个可运行的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>
    
  2. 通过ant脚本编译/生成jar,我在控制台中弹出一个窗口半秒钟和“Application start方法中的异常”,没有堆栈跟踪。我尝试使用-XX:-OmitStackTraceInFastThrow标志运行java,但它仍然不会给我一个堆栈跟踪。

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

      RenderJob.run:内部异常 java.lang.UnsatisfiedLinkError:com.sun.prism.d3d.D3DContext.nSetBlendEnabled(JZ Z)我         at com.sun.prism.d3d.D3DContext.nSetBlendEnabled(Native Method)         在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) AVA:201)         在com.sun.prism.GraphicsPipeline.getDefaultResourceFactory(GraphicsPipe) line.java:97)         在com.sun.javafx.tk.quantum.QuantumRenderer $ 3.run(QuantumRenderer.java: 143)         在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:47 1)         at 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)         at 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)

3 个答案:

答案 0 :(得分:3)

您可以使用javafxpackager部署应用程序。如果部署自包含应用程序,Java Runtime Environment将与您的应用程序捆绑在一起,无论是否安装了正确版本的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

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

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

    2. deploy文件夹中,转到其他目录distpackages

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

    4. 返回命令行(如果你离开过它)并进入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的机器上运行。

答案 1 :(得分:0)

  1. 您没有将javafxrt.jar打包到您的应用
  2. e(fx)clipse如果你使用它就会生成你的蚂蚁脚本

答案 2 :(得分:0)

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

<fx:deploy>允许您引入依赖项,但需要您构建特定于平台的安装程序。它不能用jar来完成。显然,NetBeans允许您创建一个独立的jar,但我还没有测试过。