我已经编写了一个 JavaFx 2 应用程序(在 Windows 平台上使用 Eclipse),现在我想将它部署到一个“可点击”的 jar 文件中。我的应用程序使用来自单独 jar 文件的资源代码(在 Eclipse 中,此资源代码是来自 JavaFx 应用程序项目的单独项目)。
使用我的 Ant build.xml,我为应用程序和资源代码编译了代码并创建了两个 jar 文件:
- fxdemo.jar - 我的 JavaFx 应用程序代码的 jar
- guifw.jar - JavaFx 应用程序引用的资源代码的 jar。
作为最后一步(我认为),使用 JavaFX Ant 任务,我想将这两个 jar 文件捆绑到启动我的 JavaFX 应用程序的“可点击”jar 中。我尝试使用以下来自我的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 参数时,我做错了什么?
此致