1

現在、JavaFXメディアプレーヤーを動作させようとしていますが、アプリケーションをパックするときにメディアファイルを見つけると奇妙な動作をします。Eclipseで実行すると問題なく動作しますが、Mavenを1つのjarとしてパックするとすぐに、メディアファイルが見つからなくなり、次のエラーが発生します。

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.simontuffs.onejar.Boot.run(Boot.java:340)
    at com.simontuffs.onejar.Boot.main(Boot.java:166)
Caused by: MediaException: MEDIA_UNAVAILABLE : \resources-0.0.1-SNAPSHOT.one-jar.jar     
(Das System kann die angegebene Datei nicht finden)
    at javafx.scene.media.AudioClip.<init>(AudioClip.java:65)
    at com.example.test.MyResourceTest.getResource(MyResourceTest.java:11)
    at com.example.test.MyResourceTest.main(MyResourceTest.java:18)
    ... 6 more

エラーの理由は、システムが指定されたファイルを見つけることができないことを示しています。面白いことに、実際にはone-jarファイル内で利用できるため、機能するはずです。これは私にとって一種のショーストッパーであり、Oracleフォーラムから単一の応答を得ることができませんでした。

誰でも試すことができるように、単純なEclipseプロジェクトをアップロードしました: http ://www.fileswap.com/dl/itytDY7mcY/

それ以外の場合、これはコードです。

public class MyResourceTest {

    public String getResource() {
        final URL sound = getClass().getResource("/com/example/data/sound.mp3");
        AudioClip soundEffect = new AudioClip(sound.toString());
        return sound.toString();
    }

    public static void main(String[] args) {
        System.out.println(new MyResourceTest().getResource());
    }
}
4

1 に答える 1

1

実際、この使用法を解決するための本当に良い方法を見つけました:

 getHostServices().getDocumentBase()

アプリケーションクラスでドキュメントベースを取得し、次のようなものを使用します

 Media media = new Media(documentBase + "/resources/" + name + ".mp3");
 player = new MediaPlayer(media);

またはあなたの場合:

Media media = new Media(documentBase + "/com/example/data/sound.mp3");
player = new MediaPlayer(media);

(これは、javafx アプリケーションを使用している場合にのみ機能します)

于 2013-01-22T22:52:07.133 に答える