標準のMavenセットアップを想定しています。
リソースフォルダーにabc
というファイルがあるとします。
Javaでは、どのようにしてファイルへの絶対パスを取得できますか?
ClassLoader.getResource
メソッドを使用して、正しいリソースを取得できます。
URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();
OR
これは常に機能するとは限りませんが、より簡単な解決策-
File
オブジェクトを作成し、getAbsolutePath
メソッドを使用できます。
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
実際に機能する適切な方法:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
クラスパス内のファイルが物理的にどこにあるかは問題ではありません。リソースが実際にファイルであり、JARエントリではない場合は見つかります。
(一見明らかなnew File(resource.getPath())
はすべてのパスで機能するわけではありません!パスはまだURLエンコードされています!)
/
から始まるパスを指定する必要があります
URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();
必要なクラスのclassLoaderインスタンスを作成すると、ファイルまたはリソースに簡単にアクセスできます。ここで、そのクラスのgetPath()
メソッドを使用してパスにアクセスします。
ClassLoader classLoader = getClass().getClassLoader();
String path = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(path);
絶対パスに向かう途中で2つの問題があります。
次のコードは、すべての有用なパスを提供します。
URL localPackage = this.getClass().getResource("");
URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
String localDir = localPackage.getPath();
String loaderDir = urlLoader.getPath();
System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);
ここでは、リソースフォルダのローカライズに使用できる両方の機能が調査されています。 class
については、静的または動的に取得できます。
プロジェクトがプラグインに含まれていない場合、JUnitで実行された場合のコードは次を出力します。
loaderDir = /C:.../ws/source.dir/target/test-classes/
localDir = /C:.../ws/source.dir/target/test-classes/package/
したがって、src/rest/resourcesにアクセスするには、ファイルツリーを上下に移動する必要があります。両方の方法を使用できます。そのフォルダーはターゲットフォルダーにないため、getResource(resourceFolderName)
は使用できません。作成されたフォルダにリソースを配置する人はいません。
クラスがプラグインにあるパッケージにある場合、同じテストの出力は次のようになります。
loaderDir = /C:.../ws/plugin/bin/
localDir = /C:.../ws/plugin/bin/package/
したがって、フォルダツリーを上下に移動する必要があります。
最も興味深いのは、プラグインでパッケージがlaunchedである場合です。この例では、JUnitプラグインテストとして。出力は次のとおりです。
loaderDir = /C:.../ws/plugin/
localDir = /package/
ここでは、both関数の結果のみを組み合わせた絶対パスを取得できます。そして、それだけでは十分ではありません。それらの間に、クラスパッケージがある場所のローカルパスを、プラグインフォルダーに対して相対的に配置する必要があります。おそらく、ここにsrc
またはsrc/test/resource
として何かを挿入する必要があります。
コードをあなたのものに挿入して、あなたが持っているパスを見ることができます。
ファイルまたはファイルパスを返すには
URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath(); // return file path