Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Deployment 无法在JAR中使用外部库部署JavaFX应用程序_Deployment_Ant_Jar_Javafx 2 - Fatal编程技术网

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

Deployment 无法在JAR中使用外部库部署JavaFX应用程序,deployment,ant,jar,javafx-2,Deployment,Ant,Jar,Javafx 2,我正在Eclipse中开发一个JavaFX应用程序。该应用程序有外部库,如log4j和其他库,可以从Eclipse中完美运行。我曾尝试通过Eclipse内置特性从Eclipse将其部署为可运行的jar,它在某些计算机上运行良好,而在其他计算机上,它会给我一个模糊的未定义链接错误。仔细研究之后,似乎需要通过ANT脚本或通过javafxpackager应用程序对JavaFX进行特殊打包 就我个人而言,我似乎无法通过这两种方法部署一个可运行的jar。尝试这两种方法中的任何一种,我都会遇到一个异常。我尝

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

就我个人而言,我似乎无法通过这两种方法部署一个可运行的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>
    
    
    编译源代码
    创建主jar文件
    
  • 通过ant脚本编译/生成jar,我会在控制台中弹出半秒钟的窗口和“应用程序启动方法中的异常”,没有堆栈跟踪。我已经尝试使用
    -XX:-OmitStackTraceInFastThrow
    标志运行java,但它仍然无法提供堆栈跟踪

  • 运行
    javafxpacker
    会出现以下错误:

    RenderJob.run:内部异常 java.lang.UnsatisfiedLinkError:com.sun.prism.d3d.D3DContext.nSetBlendEnabled(JZ Z) 我 位于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 ava: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 mrender.java:98) 运行(Thread.java:724)

  • 您没有将javafxrt.jar打包到应用程序中
  • 如果您使用e(fx)clipse,它会为您的应用程序生成ant脚本

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

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

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

  • 现在在命令行中,进入
    createjar
    目录并运行以下命令:

    “C:\path\to\jdk\jdk1.7.0\u 25\bin\javafxpacker.exe”-createjar-appclass package.MainClass-srcdir classes-outdir out-outfile name of yourjar-classpath”“-v

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

  • 现在在
    createjar
    文件夹旁边创建一个
    deploy
    文件夹

  • deploy
    文件夹中,使之进入其他目录
    dist

  • 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
    并将应用所需的所有依赖项/resource粘贴到此处


    最后,双击YourApp.exe,即使在没有安装Java的机器上,它也应该运行。

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


    允许您拉入依赖项,但需要构建特定于平台的安装程序。用罐子是做不到的。显然,NetBeans允许您创建一个独立的jar,但我还没有用它进行测试

    一,。javafxrt不是捆绑在较新的JRE中吗?2.我尝试过使用ANT脚本生成