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

2024-02-26

我正在 Eclipse 中开发 JavaFX 应用程序。该应用程序具有外部库,例如 log4j 等,并且可以从 Eclipse 完美运行。我尝试过通过 Eclipse 内置功能将它作为可运行 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,我会弹出一个窗口半秒钟,并在控制台中出现“应用程序启动方法中的异常”,没有堆栈跟踪。我试过用运行java-XX:-OmitStackTraceInFastThrow标志,但它仍然不会给我堆栈跟踪。

  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)


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

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

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

  3. 现在在命令行上进入createjar目录并运行此命令:

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

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

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

  2. 在 - 的里面deploy文件夹 make 到其他目录dist and packages.

  3. In the 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"

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 JAR 中的外部库部署 JavaFX 应用程序 的相关文章

  • Jetty 提供静态内容所需的最少文件集?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 为什么从 Eclipse 导出的可运行 JAR 不起作用?

    我有一个在 Eclipse 中运行良好的项目 但是 当我将其导出到可运行的 JAR 其中包含依赖项 时 它不会运行 从控制台运行 JAR 时出现的错误是 编辑 之前没有使用 jar 运行它 INFO Loading XML bean def
  • 对于 Web 应用程序来说,您理想的 git 分支架构是什么?

    我们是一个由开发人员组成的小团队 正在构建 Web 应用程序 我们目前拥有一个实时 测试和多个开发环境 您会建议什么分支架构 以便理想情况下每个开发人员都可以处理他的功能 这些功能可以在不影响其他开发人员 功能的情况下进行测试和部署 目前
  • 访问 JAR 资源

    我有一个jar包含我想要分发的资源 主要是缓存 日志记录等配置 的文件 我对这些资源的相对路径有问题 所以我做了我在另一个 stackoverflow 问题中发现的问题 该问题说这是一种有效的方法 ClassInTheSamePackage
  • 提交 Subversion 后“无法更新项目的依赖项”

    我在 NET 中有一个安装项目 当我将项目和其他项目保存到 subversion 时 安装项目不再编译 我收到错误 无法更新项目的依赖项 关闭 VS2010 然后重新打开它一直对我有用
  • 将 React-Native 应用部署到 App Store 的指南

    经过我的所有研究 我仍然无法在不使用博览会的情况下找到在应用程序商店中部署应用程序的正确文档 该应用程序在调试模式和其他测试设备下运行良好 唯一的问题是部署 我以为我已经找到一篇文章叫部署适用于 iOS 的 React Native 应用程
  • 如何在gradle中执行jar文件?

    当我使用 ant 构建我的 android 项目时 我需要这样的任务
  • 使用桌面的默认应用程序打开存储在 jar 文件中的 PDF 文件

    我的计算机科学课程的程序开发即将结束 然而 要求之一是应用程序内有一份用户手册 我在 Eclipse 工作区中将用户手册保存为 PDF 它存储在 Documents PDF Manual pdf 下 我最初使用这段代码 URL url ge
  • 如何平滑拖动JavaFX多边形?

    我有一个多边形 三角形 我想让它可以用鼠标拖动 下面是我尝试过的代码 但是使用此代码我无法顺利拖动它 请让我知道如何才能使其顺利拖动 public void start Stage primaryStage throws Exception
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa
  • 我应该使用哪个命令来缩小和优化 Nodejs Express 应用程序?

    我已经准备好 Express generator sccafold 网站并需要发布它 我应该使用哪个命令来缩小文件并优化发布 另外 我应该上传哪些目录 express generator是一个基于express框架的服务端渲染框架 而不是像
  • Spring Boot 应用程序的 .jar 无法正常工作(tomcat-embed-jasper 问题)

    我对 Spring boot 和 Maven 相当陌生 我在尝试运行可执行文件 jar 时遇到问题 我的最终目标是创建 jar 的 docker 映像 以便我可以部署我的应用程序 当我执行 mvn clean install 时 我得到了应
  • MsDeploy 虚拟目录在部署时转换为虚拟应用程序

    为了使我的 CMS 正常工作 需要将其部署到 www 根目录下的虚拟目录 以便它可以访问 通过反射 要管理的网站 注意 CMS N2CMS 当使用 Visual Studio 发布到网络 时 一切都很好 但是 当我通过 msbuild 命令
  • GoogleAppengineLauncher 登录失败

    我正在尝试部署我的 python AppEngine 项目 因此 正如我之前多次对其他项目所做的那样 我打开 GoogleAppengineLauncher 选择我的项目 单击部署 然后输入我的电子邮件和密码 然后我收到一条错误消息Fail
  • JSF 2.0 复合组件放入jar中

    我正在尝试创建一个复合组件以在我的项目中使用 因此 我创建了一个名为 componentes ui web 的项目 并放置了 2 个作为我的组件的 xhtml 文件 项目的结构是这样的 src gt gt main gt gt gt jav
  • glassfish安装中的servlet-api.jar在哪里?

    我们正在将项目从 Sun App 服务器迁移到 Glassfish 为了进行编译 我们需要将类路径设置为 servlet 容器中的 servlet api jar 在 Glassfish 安装中的哪里可以找到这些罐子 Thanks 我猜您想
  • 有没有更简单的方法来部署到WebSphere?

    我见过这个问题 https stackoverflow com questions 4046 can someone give me a working example of a buildxml for an ear that deplo
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 良好的 WiX 编辑器 [重复]

    这个问题在这里已经有答案了 我目前正在开发一个使用 WiX 创建 MSI 的项目 我过去在 Sourceforge 上使用 WiXEdit 来管理包含在 WiX 项目中的文件 因为它比直接操作 XML 稍微容易一些 但它仍然有点笨重 有谁知

随机推荐