본문 바로가기

프로젝트

[ERROR] Caused by: java.nio.file.FileSystemNotFoundException: null

jar:file:/Users/flab1/Documents/hyunjong/빵동여지도/bbangmap-spring/bbang-api/build/libs/bbang-api-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/bbang-domain-0.0.1-SNAPplain.jar!/nickname/adjective.txt

닉네임을 자동으로 생성하기 위해 파일에 있는 닉네임들을 조합해서 사용하도록 구현중, 스프링부트에서 로컬환경으로 돌렸을 경우에는 정상적으로 파일을 읽어왔지만 jar 파일로 압축해서 실행했을때 FileSystemNotFoundException이 발생하는 이슈가 있었습니다.

 

처음 구현한 코드는 resource 내부에 존재하는 경로를 받아온 후 ClassPathResource와 Path를 통해 파일을 읽어오도록 구현하였었습니다.

 

ClassPathResource를 이용한다면 src/main/resources에 포함되어있는 파일을 읽어올수 있습니다.

DefaultReadFile(String path) throws IOException {
		ClassPathResource resource = new ClassPathResource(path);
		Path path = Paths.get(resource.getURI());
		List<String> content = Files.readAllLines(path);
	}

문제가되는 부분은 Paths에 경로 URI를 넣어주는 부분이었습니다.

이 경우 ClassPathResource를 통해 URI를 불러오게 되면 

jar:file:/Users/~/build/libs/test-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/test-0.0.1-SNAPplain.jar!/test.txt

이런식으로 로컬의 절대경로를 불러오기때문에 jar파일에서 읽지못하는 이슈였습니다.

 

이 경우 jar파일에서 jar안에있는 파일에 접근하기 위해서는 URI가 아닌 inputStream을 통해 가져와야하는것을 알게되었습니다.

URI로 읽어 Path로 파일 경로를 읽는것이 아닌 InputStream으로 파일을 읽어오도록 수정하였습니다.

DefaultReadFile(String path) throws IOException {
		ClassPathResource resource = new ClassPathResource(this.stringPath);
		InputStreamReader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8);
		BufferedReader br = new BufferedReader(reader);

		String nickname = "";
		while((nickname=br.readLine()) != null){
			content.add(nickname);
		}
	}

참조

https://jessyt.tistory.com/19

 

java jar 배포 시 파일을 찾을 수 없습니다. [해결방법]

Spring boot는 내장 톰캣이 있기 때문에 jar배포를 하면 내부적으로 톰캣을 띄울 수 있습니다. 그런데 배포하자마자 resource에서 excel file 읽어올 때 에러가 났습니다. fileNotfound!!! 문제되는 소스는 아

jessyt.tistory.com

https://velog.io/@borab/springboot-jar-%EC%95%95%EC%B6%95%ED%95%9C-%EB%92%A4%EC%97%90%EB%8F%84-resource-%EB%B0%91-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B8%B0

 

springboot, jar 압축한 뒤에도 resource 밑 파일 읽기

환경 : java 13, spring bootjar 파일로 스프링 부트 애플리케이션을 압축한 뒤 로컬에서 돌렸을 때 문제 없던 소스가 jar 파일로 압축한 뒤 서버에 올리니 나타나지 않았다.해결방법은 ClassPathResource로

velog.io