2017-01-22 22 views
0

私は、startup.jarとresource.jarの2つのJarファイルにパッケージ化されたアプリケーションを作成しています。 resource.jarに私はJavaファイル(ResourceFile.java)は、コードの下にいています"class.getResource("/")"を使用した場合のNullPointerException

String dir = ResourceFile.class.getResource("/").getPath(); 

アプリケーションは「startup.jarが」を実行して起動する必要があります(2つのJARファイルが同じディレクトリに置かれます)が、私は常に上記のコードではNullPointerExceptionを取得し、私はまた、コードの下にそれを変更しようとしています:

String dir = ResourceFile.class.getClassLoader().getResource("").getPath(); 

は同じエラーを得ました。

System.out.println(ResourceFile.class.getResource("/") == null); 

print true。

私はちょっと見渡しましたが、問題を解決するのに役立つ解決策を見つけることができませんでした。

+0

jarから実行したときにファイルを取得できるのは 'getResource'だけです。存在する必要があります。 –

+3

リソース ''/''または '' ''が存在するはずの理由は何ですか? – rkosegi

+0

@rkosegi jarがどのようにビルドされているか(ジッパーにファイルのみが含まれている場合、または誤っていない場合はディレクトリエントリが含まれている場合) 'getResource(" ")'はjarファイル内のパッケージのフォルダを指します。指定されたクラス –

答えて

0

問題は、ルートディレクトリがあるだけのjarファイルが含まれているクラスパスから実行したときResourceFile.class.getResource("/")getResource戻っnullは何かが存在しない場合ので、つまり、nullを返すことで、クラスパスにjarファイルから成ります存在しないと考えられています(他のディレクトリは、jarファイルの作成方法によっては存在しないかもしれません)。クラスパスにディレクトリが含まれている場合、実際には期待どおりの場所を指していない可能性があります。 ResourceFileを想定している

ResourceFile.class.getProtectionDomain().getCodeSource().getLocation(); 

独自のjarファイル内のクラスではなく、他のいくつかの依存関係です:

は、私はあなたがで見つけることができるjarファイルの場所を探していると思います。このコードによって生成されたURLがjar自体を指していることに注意してください。

私はあなたのユースケースを知りませんが、これが本当に必要なものかどうかを慎重に検討したい場合があります。

+0

はい、私は "startup.jar"のクラスパスを印刷すると、このjarファイルのみが含まれています。ここで、どのようにクラスパスを変更できますか?ありがとう。 – Hui

+0

プログラムを実行するJARは、マニフェストファイルに 'Class-Path:'行を宣言します。詳細については、 'jar'ツールのドキュメントを参照してください。 –

+0

@Hui何をしようとしていますか? jarファイルの場所が必要な場合は、保護ドメインを使用します。それ以外の場合は、実際に何をしようとしているのかを説明する必要があります。 –

関連する問題