gpt4 book ai didi

deployment - 使用 Ant 部署带有引用 jar 的 JavaFX 2 应用程序

转载 作者:行者123 更新时间:2023-12-04 12:48:31 25 4
gpt4 key购买 nike

我已经编写了一个 JavaFx 2 应用程序(在 Windows 平台上使用 Eclipse),现在我想将它部署到一个“可点击”的 jar 文件中。我的应用程序使用来自单独 jar 文件的资源代码(在 Eclipse 中,此资源代码是与 JavaFx 应用程序项目不同的项目)。

使用 Ant build.xml,我编译了应用程序和资源代码的代码并创建了两个 jar 文件:

  • fxdemo.jar - 我的 JavaFx 应用程序代码的 jar
  • guifw.jar - JavaFx 应用程序引用的资源代码的 jar。

  • 作为最后一步(我认为),使用 JavaFX Ant 任务,我想将这两个 jar 文件捆绑到一个“可点击”的 jar 中,以启动我的 JavaFX 应用程序。我尝试使用以下来自我的 的摘录来做到这一点。 build.xml .
    <target name="deployFx" depends="fxdemo.jar" description="Releases FxDemo">
    <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
    uri="javafx:com.sun.javafx.tools.ant"
    classpath=".:${fxgui.javaHome}\lib\ant-javafx.jar"/>

    <copy file="${fxgui.lib_guifw_path}" tofile="delivery/lib/guifw.jar"/>

    <fx:application id="FxDemoGUI" name="Fx Demo GUI" MainClass="com.demo.main.MainGUI"/>

    <fx:resources id="jars">
    <fx:fileset dir="delivery/lib" includes="fxdemo.jar"/>
    <fx:fileset dir="delivery/lib" includes="guifw.jar"/>
    </fx:resources>

    <fx:jar destfile="deploy/fxDemoGui.jar">
    <!-- Define what to launch -->
    <fx:application refid="FxDemoGUI"/>

    <fx:platform javafx="2.1+">
    <fx:jvmarg value="-Xms32m"/>
    <fx:jvmarg value="-Xmx32m"/>
    <property name="com.util.fxguifw.setup" value="com/util/fxguifw/demo/demo.properties"/>
    <property name="user.language" value="en"/>
    <property name="user.country" value="GB"/>
    <property name="CSS_ID" value="NIGHT"/>
    </fx:platform>

    <fx:resources>
    <fx:fileset dir="delivery/lib" includes="fxdemo.jar"/>
    <fx:fileset dir="delivery/lib" includes="guifw.jar"/>
    </fx:resources>

    <manifest>
    <attribute name="Implementation-Vendor" value="${fxgui.vendor}"/>
    <attribute name="Implementation-Title" value="${fxgui.title}"/>
    <attribute name="Implementation-Version" value="1.0"/>
    </manifest>

    <fileset dir="delivery"/>

    </fx:jar>

    但是,之后当我尝试启动应用程序(通过单击 jar 或从命令行使用 java -jar appname.jar 启动)时,应用程序似乎找不到 Main 类:

    JavaFX 启动器错误

    无法找到类:com.demo.main.MainGUI
    C:\Program Files\Java\jdk1.7.0_09\bin>java -jar C:\MEKMAN\Clearcase_Views\wmarekm_ss_gambau\amb_c2_prototype\javafx\prototypeGUI\deploy\fxDemoGui.jar
    java.lang.ClassNotFoundException: com.demo.main.MainGUI
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.javafx.main.Main.getAppClass(Main.java:506)
    at com.javafx.main.Main.launchApp(Main.java:622)
    at com.javafx.main.Main.main(Main.java:805)

    当我研究创建的 MANIFEST.MF(在创建的 jar 文件中)时,它看起来与我预期的非常相似。
    Manifest-Version: 1.0
    JavaFX-Version: 2.1+
    implementation-vendor: MyVendor
    implementation-title: MyfirstJavaFxDeploy
    implementation-version: 1.0
    JavaFX-Application-Class:com.demo.main.MainGUI
    JavaFX-Class-Path: fxdemo.jar guifw.jar
    Created-By: JavaFXPackager
    Main-Class: com/javafx/main/Main

    ...但话又说回来,它不起作用,很明显我做错了什么。

    我还尝试通过添加以下内容来包含类目录(来自两个 Eclipse/项目中的每一个的输出文件夹):
    <fileset dir="../guifw/classes"/>
    <fileset dir="classes"/>

    然后,启动器确实找到了我的主类(com.demo.main.MainGUI),但由于缺少 而无法正确运行。 -D 参数 我试图指定:
    <property name="com.util.fxguifw.setup" value="com/util/fxguifw/demo/demo.properties"/>

    所以,如果你读到这里,我的问题是:
  • 为什么启动器在引用的 jar (fxdemo.jar) 中找不到我的主类?
  • 在为应用程序指定 -D 参数时,我做错了什么?

  • 此致

    最佳答案

    我研究/测试了@Anders Petersson 链接中的帖子 ( 2012-apr-12 03:32 ) 中提供的修复:

    Link from @Anders Petersson

    据我所知,这是 的解决方法解封生成的 jar 文件 (fxDemoGui.jar) 中的任何使用过的 jar 文件(在我的情况下;guifw.jar 和 demofx.jar),就像从我的两个 Eclipse 项目中添加类文件夹一样(如问题中所述)。

    我将示例调整为我的 build.xml 并在稍微添加后让它工作:

    <target name="dist" depends="fxdemo.jar">

    <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
    uri="javafx:com.sun.javafx.tools.ant"
    classpath=".:${fxgui.javaHome}\lib\ant-javafx.jar"/>

    <copy file="${fxgui.lib_guifw_path}" tofile="delivery/lib/guifw.jar"/>

    <fx:jar destfile="predeploy/fxDemoGui.jar">
    <!-- ADDITION -> Adds the Launcher's Main class to the resulting jar (com.javafx.main.Main)! -->
    <fx:application id="FxDemoGUI"
    name="Fx Demo GUI"
    mainClass="com.demo.main.MainGUI"/>

    <fileset dir="delivery"/>
    </fx:jar>
    </target>

    分布 -target 从示例中,我不得不添加:
    <fx:application id="FxDemoGUI"
    name="Fx Demo GUI"
    mainClass="com.demo.main.MainGUI"/>

    没有它,生成的 jar 文件没有必要的 com.javafx.main.Main -class,因此无法启动。

    所以,这个解决方案提出了 我的问题 1) 的有用解决方法

    尽管如此,如果有人提出如何在生成的 jar/文件中保持 jar 文件完整的解决方案,我将不胜感激。

    关于deployment - 使用 Ant 部署带有引用 jar 的 JavaFX 2 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604313/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com