質問: いつもお世話になっています。 JavaFXでGUIアプリケーションを作成しています。 開発環境はeclipceを使用してます。 私は、MacOS XとWindows7(64bit)のパソコンを持っており アプリケーションは、MacOS Xの方で作成しました。 作りたかった機能があらかた完成し、 eclipseで実行しても問題なく動作しているようなので、 「エクスポート」>「実行可能JARファイル」として出力したのですが、 MacでもWindowsでも、正しく起動しません。 **追記:この現象は、「生成されるJARに必須ライブラリーをパッケージ」を選択した場合のみで発生します。** 「エクスポート」>「JARファイル」として出力すると、 MacでもWindowsでも、 問題なく起動し、アプリケーションを使用できます。 Windowsの方は、実行可能jarファイルを起動するために、 Javaを再インストールしたり、64bit用のJavaをインストールしたり 環境変数の設定をしたりと色々触ってみたりみたのですが、ダメでした。 fxmlファイルについては、JARファイルでエクスポートすれば起動できることと ほとんど「JavaFx Scene Builder2.0」で作成していたため ここには原因がないのではないかと思い、細かい確認などはしていないです。 **追記:eclipseにて、「実行可能JARファイル」をエクスポートする際、 「生成されるJARに必須ライブラリーを抽出」や 「生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー」を選択していた場合は、 jarファイルが問題なく起動しました。** ### 追記:目的 後々は、javapackagerを使って 自己完結型アプリケーションにしたいです。 > > http://aoe-tk.hatenablog.com/entry/2015/12/19/170651 > > > 上記のサイトを参考に、起動できるJARファイルから javapackagerを使ってexeファイルを作成してみましたが インストール後、「No main class specified」「Find angle to launch JVM」 というメッセージが出るだけで、こちらも起動しません。 **まだ、エクスポート時の方法によって起動できない原因は分かっていませんが 最終目的は、自己完結型アプリケーションとしてのパッケージなので、 それを達成するための原因は別件かと思い、タイトルも変更しました。 恐れ入りますが、何卒よろしくお願いします。><** ### エラーメッセージ コマンドプロンプトで > > java -jar アプリケーション名.jar > log.txt 2>&1 > > > このように入力すると、 eclipseで、「実行可能JARファイル」の 「生成されるJARに必須ライブラリーをパッケージ」を選択してエクスポートした場合のみ、 以下のようなエラーが出力され、ウィンドウなどが全く表示されません。 ただ、タスクマネージャーを確認すると、「java.exe」が起動しています。 ダブルクリックで起動した場合は、「javaw.exe」が起動します。 どちらも、「Java(TM) Platform SE binary」となってます。 これらは、エラーが出た後、タスクマネージャーから終了させるまで動いているみたいです。 ``` javafx.fxml.LoadException: application/MainForm.fxml:26 at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) at application.Main.start(Main.java:21) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) at java.lang.Thread.run(Unknown Source) Caused by: java.net.MalformedURLException: Could not open InputStream for URL 'rsrc:ActionForm.fxml' at org.eclipse.jdt.internal.jarinjarloader.RsrcURLConnection.getInputStream(RsrcURLConnection.java:46) at java.net.URL.openStream(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2440) at javafx.fxml.FXMLLoader.access$2700(FXMLLoader.java:103) at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143) at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746) at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) ... 17 more ``` ### 追記:MANIFEST.MF こちらが「実行可能JARファイル」でエクスポートした.jarファイルから MANIFEST.MFを展開したものです! ``` Manifest-Version: 1.0 Rsrc-Class-Path: ./ org.eclipse.fx.ide.css.jfx8_2.3.0.201603030809.jar Class-Path: . Rsrc-Main-Class: application.Main Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader ``` こちらが「JARファイル」でエクスポートした.jarファイルから MANIFEST.MFを展開したものです! ``` Manifest-Version: 1.0 Main-Class: application.Main ``` ### 追記:javapackager 「管理者として実行」でコマンドプロンプトを起動して、以下のように入力しています。 > > javapackager -deploy -native exe -outdir C:\test -outfile test -srcdir C:\test -srcfiles test.jar -appclass application.Main -name test > > > C:\testの中にJARファイルを保存しています。出力先も同じC:\testです。 この時点では、特にエラーなどは確認されず、 ファイルは以下のディレクトリに保存されました、みたいなメッセージが出てきて終了しています。 作成された.exeファイルも、インストールやアンインストール時の動作に問題はないように見えます。
回答: スタックトレースを拝見するとFXMLの場所の指定の仕方に起因する問題に見えます。 java.net.MalformedURLException: Could not open InputStream for URL 'rsrc:ActionForm.fxml' とありますね。自分は普段次のように単純にメインクラスパッケージにFXMLを置く前提でスタートメソッドを書きます。 ``` package com.ksoh.myapp; ... public class MyApplication extends Application { @Override public void start(Stage primaryStage) throws Exception { FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml")); Parent root = loader.load(); ... } } ``` IDEはeclipseではなくIntelliJなのですが、「JavaFXアプリケーション」という専用のパッケージャーを用いてJavaFXアプリケーションに関する諸元を入力した場合のMANIFEST.MFは例えば次のようになります。(太字がJavaFXアプリケーションの諸元として指定した内容です) Manifest-Version: 1.0 Implementation-Title: **KSOH MyApplication** Implementation-Version: Permissions: sandbox JavaFX-Version: 8.0 Class-Path: Created-By: JavaFX Packager Implementation-Vendor: **KSOH** Main-Class: **com.ksoh.myapp.MyApplication** こうして生成されたjarをWindows10のexplore上でダブルクリックすると普通に起動できます。MANIFEST.MFの中で肝心と思えるのはMain-Classの指定です。ここが正しく設定されてさえいればJavaFXアプリケーションでも普通のアプリケーションでもダブルクリックで起動できる気がします。 質問者さんはeclipseにより2つの違ったjarパッケージングをされているようですが、動く場合と動かない場合のMANIFEST.MFの違いを確認してみるとよいと思います。(質問を編集してその2つを記載されるとeclipseを使っていない閲覧者のみなさんにも内容が把握できると思います) ご存知と思いますが、生成されたjarファイルがx.jarだとするとターミナル上で `jar xvf x.jar META-INF/MANIFEST.MF` とするとjarの中のMANIFEST.MFが展開されるので中身を確認できます。