표준 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
답변
절대 경로로가는 길에는 두 가지 문제가 있습니다.
- 발견 된 배치는 소스 파일이있는 위치가 아니라 클래스가 저장되는 위치입니다. 그리고 리소스 폴더는 거의 확실하게 프로젝트의 소스 폴더 어딘가에있을 것입니다.
- 리소스 검색을위한 동일한 함수는 클래스가 플러그인에서 실행되거나 작업 영역의 패키지에서 직접 실행되는 경우 다르게 작동합니다.
다음 코드는 모든 유용한 경로를 제공합니다.
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
여기에 무언가를 삽입해야 할 것 입니다.
코드를 자신의 코드에 삽입하고 가지고있는 경로를 볼 수 있습니다.