2017-05-21 12 views
6

私の仕事は、メディアファイルのリストを表示し、これらのメディアファイルをデフォルトのOSメディアプレーヤーで別々に実行する小さなプログラムを作成することです。netbeansで実行可能なJarプロジェクトの適切なパッケージ化

私の現在のソリューションは、すべてのメディアファイルを保持しているパッケージを作成するようなものだった:

-com.media 
     |_a.mp4 
     |_b.mp4 

一時ディレクトリに以下のコードをコピーし、選択可能なmp4は、デフォルトのOSのメディアプレーヤーを実行します:

私はそれがespectedとして動作しますが、私は clean/buildを行う際に、ビルドから作成 .jarを実行Netbeansのを介して、プログラムを実行すると
public File copyTempMedia(File tempAppFolder, String videoName) { 

    URL f = getClass().getResource(String.format("%s/%s", Constants.MEDIA_LOCATION, videoName)); 
    File from = new File(f.getPath()); 
    File to = new File(tempAppFolder.getAbsolutePath()); 

    try { 
     FileUtils.copyFileToDirectory(from, to); 
    } catch (IOException ex) { 
     Logger.getLogger(MediGUIModel.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    System.out.println("Temp video copied: " + to.getAbsolutePath() + "/" + to.getName()); 
    return to; 
} 

public void triggerMediaPlayer(String fileLocation) { 
    System.out.println("Triggering media player: " + fileLocation); 
    try { 
     if (OPERATIN_SYSTEM.contains("Linux")) { 
      Runtime.getRuntime().exec("sh -c " + fileLocation); 
     } else if (OPERATIN_SYSTEM.contains("Windows")) { 

      Runtime.getRuntime().exec("cmd /c " + fileLocation); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(MediGUIModel.class.getName()).log(Level.SEVERE, null, ex); 
     ex.printStackTrace(); 
    } 
} 

、メディアファイルが読み込まれていないようですので、私の質問は以下のとおりです。

  1. なぜNetbeansで動作し、ビルド.jarでは動作しないのですか?
  2. これはこの問題の最適な解決方法ですか?
  3. メディアを別にパッケージする必要がありますか?

ありがとうございます。

編集

だから、コンソールの代わりに、ダブルクリックジャーを通じて実行した後、私はファイルを読み込む行にnullポインタ例外を取得することです:

URL f = getClass().getResource(String.format("%s/%s", Constants.MEDIA_LOCATION, videoName)); 

なぜそれがNetebeansでは動作しませんが、ビルド/ jarで?

jarファイル内に別の場所がありますので、getResourceやgetResourceAsStreamで問題なく読み込めますか?

答えて

3

プロジェクトをNetBeansで実行すると、java -jar yourproject.jarのような実行可能なjarが実行されていません。代わりに、クラスパスをjava -cp build/classes com.media.YourMainClassのようなビルド/クラスソートに設定します。これは、あなたのビデオファイルがあなたのプロジェクト/ build/classes/com/mediaにある実際のファイルであり、ファイルシステム内の通常のファイルとしてアクセスされ、通常のファイルのようにコピーされることを意味します。 jarファイルから実行すると、ファイルはjarファイルにパックされ、単純なファイルコピーコマンドを使用してコピーすることはできません。

getClass().getResource()を呼び出してURLを取得する代わりに、getClass().getResourceAsStream()を呼び出してInputStreamを取得してみてください。入力ストリームから一時ファイルにバイトをコピーする単純なループを書くことができます。

+0

ちょっとCorey、私は 'getResourceAsStream'を使ってみましたが、これはnullを返します。 他の提案はありますか? – shep

+0

jarファイルにメディアファイルを置くことができる別の場所があるので、 'getResource'または' getResourceAsStream'によって問題なく読み込まれますか? – shep

+0

パスが正しくないので、あなたはnullを取得しています。先行するスラッシュ「/com/media/a.mp4」を追加してみてください。 – Corey

1

[OK]をので、私は解決策が見つかりました:

  1. media.*.mp4で別のプロジェクトを作成します。
  2. Jarとしてエクスポートします。
  3. ライブラリをデスクトップアプリにインポートします。
  4. ライブラリがクラスパスにあることを確認してください。

このソリューションは私のために働く...

誰が恵みがこのスニペットは役に立つかもしれ最大:)

2

でうまくいけば前に、聞いて幸せよりよい解決策を持っている場合:

BufferedInputStream result = (BufferedInputStream) getClass().getResourceAsStream("/com/media/a.mp4"); 
    byte[] bytes = new byte[4098]; 
    try { 
     result.read(bytes); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println(new String(bytes)); 

あなたは、ループ内のバイトを読み込む必要があります別の瓶を必要とせずに動作するはずです。

2

メディアファイルをjarファイルに入れるのは良い考えではないと思います。プロジェクトを変更してjarファイルのサイズを大きくしたい場合は、プロジェクトを再構築する必要があるからです。

用途:

File from = new File(String.format("%s/%s", Constants.MEDIA_LOCATION,videoName)); 

jarファイルと同じフォルダからファイルをロードします。

メディアをjarファイルに保存する場合は、Mavenプロジェクトを作成し、mp4をsrc/main/resourcesに配置します。 mavenを使用してfat jarを作成し、src/main/resourcesがjarに含まれます。 pom.xmlを設定するには 'maven-shade-plugin'を参照してください。https://www.mkyong.com/maven/create-a-fat-jar-file-maven-shade-plugin/

他のMavenの素晴らしいプロパティを使用することができます。

Reading a resource file from within jar

編集

いくつかの試みの後、私は右の瓶から 'のgetResource' でそれを得ることはできませんを参照してください。 jar内から取得するパスは、file:/C:/.../JavaApplication4/dist/JavaApplication4.jar!/test.txt のようなもので、有効なファイルシステムパスとして認識されません。

'getResourceAsStream'を使用して、jarファイルをローカルフォルダにコピーできます。

InputStream in; 
OutputStream out; 
IOUtils.copy(in,out); 
in.close(); 
out.close(); 
関連する問題