での相対パスの使用java.io.Fileは、現在の作業ディレクトリに完全に依存しています。これは、JAR の実行方法によって異なります。たとえば/foo、にいて、JAR を実行したjava -jar /bar/jar/Bar.jar場合、作業ディレクトリはまだ/foo. しかし、実行cdし/bar/jarて実行するとjava -jar Bar.jar、作業ディレクトリは/bar/jar.
JAR が配置されているルート パスが必要な場合は、次のいずれかの方法があります。
File root = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI());
これは、JAR ファイルのルート パスを返します (つまり、クラスパス ルート)。リソースをクラスパス ルートに相対的に配置すると、次のようにアクセスできます。
File resource = new File(root, "filename.ext");
または、次を使用することもできます。
File resource = new File(Thread.currentThread().getContextClassLoader().getResource("filename.ext").toURI());