7

最近、getResourceAsStream メソッドの非常に奇妙な動作に遭遇しました。

Windows で開発したアプリケーションがあります。このアプリは、OSGI フレームワークに基づくデスクトップ アプリケーションです。バンドルを作成し、必要なパッケージをセットアップし、これらのパッケージにいくつかのデータ ファイルを追加して、それらが jar ファイル内に含まれるようにしました。

それを使用してデータをロードします:

this.getClass().getResourceAsStream("pl/com/myapp/resource.dat");

Eclipse と、アプリケーションをデプロイして IDE の外部のシステムで実行したときの両方でうまく機能しました。

その後、開発をubuntu 12.04に移しました。驚いたことに、上記のメソッドは常に null を返します。データはあるべき場所にあります。すべての設定は問題ないようです。構成ファイルに絶対パスはありません。

私は多くの異なることを試しました。パスを次のように変更しました。

this.getClass().getResourceAsStream("/pl/com/myapp/resource.dat");

パッケージルートを含めないようにしましたが、クラスの場所に相対的なパスを挿入しようとしました (私のクラスが pl.com.myapp.MyClass であると仮定しましょう):

this.getClass().getResourceAsStream("resource.dat");

私も試しました:

this.getClass().getResourceAsStream("./resource.dat");

しかし、何も機能しませんでした:(

しかし、単純な Java アプリケーションを作成すると、すべてがスムーズに機能し、メソッドは適切なストリームを返します。

誰かがそのような問題に遭遇しましたか?

ubuntu 12.04でeclipse-junoを使用しています。

4

2 に答える 2

2

単なる推測ですが、this.getClass()あなたが思っているクラスではない可能性はありますか? たとえば、誰かがサブクラス化するthis.getClass()と、ベースクラスではなくサブクラスが返されます。ベースクラスは別のバンドルにある可能性があるため、リソースが表示されません。

この種のリソース ルックアップを行うときは、常にリテラル クラス名を使用する必要がありますMyClass.class.getResourceAsStream()

于 2013-02-14T13:39:07.077 に答える