7

JavaFx 2 アプリケーション (Windows プラットフォームで Eclipse を使用) を作成しましたが、それを「クリック可能な」jar ファイルにデプロイしたいと考えています。私のアプリケーションは、別の jar ファイルのリソース コードを使用します (Eclipse では、このリソース コードは JavaFx アプリケーション プロジェクトとは別のプロジェクトです)

Ant build.xml を使用して、アプリケーションとリソース コードの両方のコードをコンパイルし、2 つの jar ファイルを作成しました。

  1. fxdemo.jar - JavaFx アプリケーション コードの jar
  2. guifw.jar - JavaFx アプリケーションによって参照されるリソース コードの jar。

最後のステップ (私が考えた) として、JavaFX Ant タスクを使用して、これら 2 つの 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

...しかし、やはりうまくいかないので、明らかに私は何か間違ったことをしました。

また、次を追加して、classes-directory (2 つの 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"/>

したがって、ここまで読んだ場合、私の質問は次のとおりです。

  1. 参照されている jar (fxdemo.jar) でランチャーがメイン クラスを見つけられないのはなぜですか?
  2. アプリケーションに -D 引数を指定する際に、何が間違っていたのでしょうか?

よろしくお願いします

4

1 に答える 1

2

@Anders Petersson からのリンクで、投稿 ( 2012-apr-12 03:32 ) で提示された修正を調査/テストしました。

@Anders Petersson からのリンク

私が見る限り、これは結果のjarファイル(fxDemoGui.jar)内で使用されているjarファイル(私の場合はguifw.jarとdemofx.jar)をアンバンドルする回避策です。 2 つの 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>

例のdist -target に、次を追加する必要がありました。

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

これがないと、結果の jar ファイルに必要なcom.javafx.main.Mainクラスが含まれていなかったため、起動に失敗していました。

したがって、このソリューションは私の質問に対する有用な回避策を提示します 1)

それでも、結果のjarファイル内でjarファイルをそのまま保持する方法について誰かが解決策を思いついたら、私は感謝しています。

于 2012-11-29T13:09:14.927 に答える