1

実行時にロードする必要があるバンドルされたリソース (言語モデルのバイナリ ファイル) を含む jar ファイルがあります。jar 内のディレクトリ構造は次のとおりです。

tagger/app.class tagger
/models/stop/SentDetect.bin.gz

ここで、SentDetect.bin.gz は、パスが文字列パラメーターとしてサードパーティ クラス (SentDetector) に読み込まれるバイナリです。つまり、

URL url = this.getClass().getResource("models/stop/SentDetect.bin.gz");
SentenceDetector sdetector = new SentenceDetector(url.getPath());

Netbeans では問題なく動作しますが、コマンド ラインから jar として実行しようとすると、コンストラクターで FileNotFound Exception が発生します。コンパイル済みの Jar ファイルにバイナリが含まれていることを再確認しました。

解決策は通常、getResourceAsStream() を使用して入力ストリームとしてデータをロードすることだと思いますが、これはここではオプションではありません。URL が文字列パラメーターとしてサードパーティのコンストラクターに渡されているためです。問題は、URL が文字列に解析される方法にありますか?

私が試してみました:

url.getPath();
url.getFile();
url.toURI().getPath();
url.toString();

すべてがファイルに異なるパスを与えています。

4

2 に答える 2

1

バイナリが間違いなく正しい場所にあり、jar ファイルが間違いなくクラスパスにある場合は、問題ないように思えます。(クラス自体を見つけることができると思いますか?あなたが使用していることを考えると、そうなると思いますthis.getClass())。

問題を引き起こしている可能性があるのは、ファイル名の大文字と小文字です。Windows を使用している場合、ファイル システムからファイルをロードするときは大文字と小文字が区別されません。jar ファイルでは、大文字と小文字が区別されます。コードの大文字小文字が jar ファイルの大文字小文字と一致することを確認してください。

于 2010-01-30T15:00:53.403 に答える
0

経由で Jar ファイル内のリソースにアクセスすることはできませんjava.io.File。ではなくSentenceDetectorを受け入れる代替コンストラクタ、または を受け入れてを取得するために使用する代替コンストラクタを提供する必要があります。InputStreamStringURLURL.openStream()InputStream

于 2012-06-06T21:44:03.710 に答える