För*_*ren 7 ant deployment executable-jar javafx-2
我编写了一个JavaFx 2应用程序(在Windows平台上使用Eclipse),现在我想将它部署到"可点击"的jar文件中.我的应用程序使用来自单独jar文件的资源代码(在Eclipse中,此资源代码是与JavaFx应用程序项目分开的项目).
使用我的Ant build.xml,我编译了应用程序和资源代码的代码,并创建了两个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>
Run Code Online (Sandbox Code Playgroud)
但是,之后当我尝试启动应用程序时(通过单击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)
Run Code Online (Sandbox Code Playgroud)
当我研究创建的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
Run Code Online (Sandbox Code Playgroud)
......但是又一次,它不起作用,显然我做错了什么.
我还尝试通过添加以下内容来包含classes-directory(来自两个Eclipse /项目中的每个的输出文件夹):
<fileset dir="../guifw/classes"/>
<fileset dir="classes"/>
Run Code Online (Sandbox Code Playgroud)
然后,启动程序确实找到我的主类(com.demo.main.MainGUI),但是错误地运行正确,因为它缺少我试图指定的-D参数:
<property name="com.util.fxguifw.setup" value="com/util/fxguifw/demo/demo.properties"/>
Run Code Online (Sandbox Code Playgroud)
所以,如果您已经阅读了这篇文章,我的问题是:
最好的祝福
我研究/测试了来自 @Anders Petersson 的链接中帖子 ( 2012-apr-12 03:32 )中提出的修复:
据我所知,这是一种解决方法,可以在生成的 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>
Run Code Online (Sandbox Code Playgroud)
在示例中的dist -target中,我必须添加:
<fx:application id="FxDemoGUI"
name="Fx Demo GUI"
mainClass="com.demo.main.MainGUI"/>
Run Code Online (Sandbox Code Playgroud)
如果没有它,生成的 jar 文件没有必要的com.javafx.main.Main类,因此无法启动。
因此,这个解决方案为我的问题提供了一个有用的解决方法 1)
尽管如此,如果有人提出如何在生成的 jar/文件中保持 jar 文件完整的解决方案,我将不胜感激。
| 归档时间: |
|
| 查看次数: |
4161 次 |
| 最近记录: |