3

このコード スニペットを使用して、ファイルを入力ストリームとして取得します。ファイル version.txt は、アプリの jar の一番上のフォルダーにパッケージ化されています。

InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt");

これはほとんど常に機能します。しかし、あるユーザーの場合、別の version.txt を取得していますが、それは私の jar にはありません。これにより、jar にある特定の version.txt ファイルが確実に読み込まれるようにするにはどうすればよいですか?

4

3 に答える 3

10

「最上位のフォルダ」というのは、デフォルトのパッケージのことですか?その場合、version.txt最初の一致が見つかるまでJavaがクラスパスに沿って検索するため、JARが他のファイルに貢献しているものよりもクラスパス上で前にあることを確認する必要があります。

JAR が常に最初になるようにするのは難しいため、次のversion.txtようなデフォルト以外のパッケージにファイルを配置する必要があります。

com.yourcompany.yourproject.version

そして、それを見つけるためにコードを変更する必要があります:

Stream resource = getClass().getClassLoader().getResourceAsStream("com/yourcompany/yourproject/version/version.txt");

デフォルトのパッケージを使用することはアンチパターンです。

于 2009-09-30T12:37:13.173 に答える
3

これは、最上位パッケージに物を入れることに固有の危険であり、本当に欲しくないものを拾ってしまう可能性があります。これは利点になる可能性があります (たとえば、log4j 構成の場合のように) が、通常は必要なものではありません。

version.txtcom.myapp (またはパッケージ名が何であれ) など、アプリケーションのパッケージ構造内に配置し、そこから次を使用してロードすることを強くお勧めします。

getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt");
于 2009-09-30T12:37:18.243 に答える
0

コード スニペットは、このクラスをロードしたクラス ローダーを使用して version.txt ファイルを検索します。ファイルが複数の場所でクラスローダーによって使用されるクラスパスに存在する場合、(クラスパスの順序によっては) 間違ったファイルが返される可能性があります。

于 2009-09-30T13:10:52.423 に答える