3

Eclipse で JavaFX アプリケーションを開発しています。アプリには log4j などの外部ライブラリがあり、Eclipse から完全に実行されます。Eclipse の組み込み機能を使用して Eclipse から Runnable jar としてデプロイしようとしましたが、一部のコンピューターではうまく動作しますが、他のコンピューターではあいまいな未定義のリンク エラーが発生します。調べてみると、ANTスクリプトまたはjavafxpackagerアプリケーションを介してJavaFXを特別にパッケージ化する必要があるようです。

私の人生では、これらの方法のいずれかを介して実行可能な 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 をコンパイル/生成すると、0.5 秒間ウィンドウ ポップアップが表示され、コンソールに "Exception in Application start method" がスタック トレースなしで表示されます。フラグを指定して Java を実行しようとしました-XX:-OmitStackTraceInFastThrowが、それでもスタック トレースは表示されません。

  1. 実行するjavafxpackagerと、次のエラーが発生します。

    RenderJob.run: 内部例外 java.lang.UnsatisfiedLinkError: com.sun.prism.d3d.D3DContext.nSetBlendEnabled(JZ Z)I at com.sun.prism.d3d.D3DContext.nSetBlendEnabled(Native Method) at 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.java:179) で com.sun.prism.d3d.D3DPipeline. com.sun.prism.GraphicsPipeline.getDefaultResourceFactory(GraphicsPipe line.java:97) の getDefaultResourceFactory(D3DPipeline.java:201) com.sun.javafx.tk.quantum.QuantumRenderer$3.com.sun. java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) で、java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) で、prism.render.RenderJob.run(RenderJob.java:37) com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:98) で java.lang.Thread.run(Thread.java:724) でcom.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java :98) java.lang.Thread.run(Thread.java:724) でcom.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java :98) java.lang.Thread.run(Thread.java:724) で

4

3 に答える 3

3

を使用してアプリケーションをデプロイできますjavafxpackager自己完結型のアプリケーションをデプロイすると、Java ランタイム環境がアプリケーションにバンドルされ、適切なバージョンの Java がインストールされているかどうかに関係なく、任意のマシンで実行されます。( bin フォルダーの下の jdk ディレクトリにあるはずjavafxpackagerです。 )

  1. .classEclipse ワークスペース フォルダーでコンパイル済みファイル ( ) を探します。それらは bin ディレクトリにある必要があります。

  2. フォルダを作成し、createjarその中に と フォルダをclasses作成し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

outこれにより、ディレクトリに実行可能な jar が作成されます。次のステップで必要になります。

  1. deploy次に、フォルダーと一緒にフォルダーを作成しcreatejarます。

  2. フォルダー内のdeploy他のディレクトリdistpackages.

  3. フォルダーに、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"

完了すると、Windows プラットフォームで実行するネイティブ ファイルを含め、アプリを展開するために必要なすべてが作成されているはずです。.exeこれは自己完結型のアプリケーションです。実行できるようにするにはbundles\NameOfYourApp\app、アプリに必要なすべての依存関係/リソースをここに貼り付ける必要があります。

最後に、YourApp.exe をダブルクリックすると、Java がインストールされていないマシンでも動作するはずです。

于 2013-09-17T08:33:08.567 に答える
1

Ant ファイルには、2 つの主なオプションがあります:<fx:jar><fx:deploy>. 前者は、依存関係が jar と同じファイルにある場合に、依存関係を参照できるようにする jar を生成するだけです。jar を解凍し、生成された MANIFEST ファイルを見て、それらが javafx クラスパスにどのように追加されているかを確認できます。

<fx:deploy>依存関係を取り込むことができますが、プラットフォーム固有のインストーラーをビルドする必要があります。jar を使用して行うことはできません。どうやら NetBeans ではスタンドアロンの jar を作成できるようですが、私はそれをテストしていません。

于 2013-10-27T17:14:07.017 に答える
0
  1. アプリに javafxrt.jar をパッケージ化していない
  2. e(fx)clipse を使用すると、ant-script が生成されます。
于 2013-09-16T08:24:48.863 に答える