[java] 프로젝트의 / resources 폴더에있는 파일의 절대 경로를 얻는 방법

표준 maven 설정을 가정합니다.

리소스 폴더에 파일이 있다고 말합니다 abc.

Java에서 파일의 절대 경로를 어떻게 얻을 수 있습니까?



답변

ClassLoader.getResource방법을 사용 하여 올바른 리소스를 얻을 수 있습니다 .

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

또는

이것이 항상 작동하지는 않지만 더 간단한 해결책-

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);


답변

파일 또는 파일 경로를 반환하려면

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


답변

절대 경로로가는 길에는 두 가지 문제가 있습니다.

  1. 발견 된 배치는 소스 파일이있는 위치가 아니라 클래스가 저장되는 위치입니다. 그리고 리소스 폴더는 거의 확실하게 프로젝트의 소스 폴더 어딘가에있을 것입니다.
  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/

따라서 다시 폴더 트리를 위아래로 이동해야합니다.


가장 흥미로운 것은 플러그인에서 패키지가 시작 되는 경우입니다. 예를 들어 JUnit 플러그인 테스트로. 출력은 다음과 같습니다.

loaderDir = /C:.../ws/plugin/
 localDir = /package/

여기서 우리는 함수 의 결과 만 결합하여 절대 경로를 얻을 수 있습니다 . 그리고 그것은 충분하지 않습니다. 그들 사이에 우리는 플러그인 폴더에 상대적으로 클래스 패키지가있는 장소의 로컬 경로를 넣어야합니다. 아마도 src또는 src/test/resource여기에 무언가를 삽입해야 할 것 입니다.

코드를 자신의 코드에 삽입하고 가지고있는 경로를 볼 수 있습니다.


답변