我正在 Eclipse 中开发 JavaFX 应用程序。该应用程序具有外部库,如 log4j 和其他库,并且可以从 Eclipse 完美运行。我已经尝试通过 Eclipse 内置功能将它作为 Runnable jar 从 Eclipse 部署,并且它在某些计算机上运行良好,而在其他计算机上它会给我一个模糊的未定义链接错误。仔细研究之后,JavaFX 似乎需要通过 ANT 脚本或 javafxpackager
应用程序进行特殊打包。
对于我来说,我似乎无法通过这两种方法中的任何一种来部署可运行的 jar。尝试这两种方法中的任何一种,我都会得到一个异常。我尝试过的事情:
通过 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,但它仍然不会给我堆栈跟踪。
运行
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
。)
在您的 eclipse 工作区文件夹中查找编译后的文件 (
.class
)。它们应该在 bin 目录中。创建一个
createjar
文件夹,并在其中创建一个classes
和一个out
文件夹。将所有 .class 文件复制到classes
文件夹中。还将您的应用程序所需的所有 jar 包含在类文件夹中。现在在命令行上进入
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。下一步将需要它。
现在在
createjar
文件夹旁边创建一个deploy
文件夹。在
deploy
文件夹中创建其他目录dist
和packages
。在
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/