eclipse로 jar 파일 실행하기
이번에 eclipse로 jar 파일을 생성해서 터미널에서 실행해보는 실습을 했다.
우선 인텔리제이와 이클립스 둘 다 돌아가는 코드
https://github.com/jasonpark112/eclipse-jar-libraryprogram
GitHub - jasonpark112/eclipse-jar-libraryprogram
Contribute to jasonpark112/eclipse-jar-libraryprogram development by creating an account on GitHub.
github.com
여기서 찾아 볼 수 있다 ..
기능은
이렇게 작동할 수가 있다. 만약 잘 못된 값을 입력하면 재귀함수를 통해 다시 재입력하게 해놨다.
이제 이를 eclipse에서 jar파일을 만들어 실행했는데, 계속해서
이렇게 파일을 못 읽는 문제가 발생한다.
도대체 원인이 뭘까 해서 찾아 본 결과,
리소스 파일을 JAR에 포함: Files.readAllLines 메서드는 파일 시스템에서 직접 파일을 읽습니다. 만약 파일이 JAR 내부에 있다면, 일반 파일 시스템 경로로는 접근할 수 없습니다. 이 경우, 클래스 로더를 사용하여 리소스를 읽어야 합니다. 예를 들어, getClass().getResourceAsStream("/fileName")을 사용할 수 있습니다.
JAR 파일 환경 (배포 시)
- 내부 구조 접근: JAR 파일 내에서는 파일 시스템 경로가 존재하지 않습니다. JAR 파일은 압축된 아카이브이며, 파일 시스템과 같은 방식으로 직접 접근할 수 없습니다.
- 클래스 로더의 동작: JAR 파일 내에서 클래스 로더는 JAR 아카이브 내의 경로를 기반으로 리소스를 찾습니다. 예를 들어, resources/books.txt는 JAR 내부의 경로입니다. 이클립스에서와 달리, JAR 내부에서는 src/main/resources 경로가 존재하지 않습니다.
Files.readAllLines(path) 메서드를 사용할 때 Path 객체는 일반적으로 파일 시스템의 경로를 가리킵니다. 이 방법은 파일 시스템에 직접 접근할 수 있는 일반적인 애플리케이션 또는 개발 환경(예: 이클립스)에서는 잘 작동합니다.
그러나, JAR 파일 내부에서는 이 방식이 작동하지 않습니다. JAR 파일은 압축된 아카이브 형태로, 전통적인 파일 시스템 구조를 따르지 않습니다. 따라서, Files.readAllLines(path)와 같은 메서드를 사용하여 JAR 파일 내부의 리소스에 접근하려고 하면 FileNotFoundException 또는 유사한 오류가 발생합니다.
JAR 파일 내부의 리소스에 접근하려면 다음과 같은 방법을 사용해야 합니다:
즉, 핵심은
try (InputStream is = getClass().getClassLoader().getResourceAsStream("resources/" + fileName)) {
if (is == null) {
System.out.println("Failed to load resource: " + fileName);
return list;
}
이고,
이클립스가 파일을 읽는 방법과 JAR이 파일을 읽는 방식이 다르기 때문에 발생하는 문제라고 볼 수 있다.
전체적으로 이해는 할 수 있지만, 제대로 다시 공부를 해볼 필요가 있을 것 같다 !
이후 jar을 위한 코드는
https://github.com/jasonpark112/eclipse-jar-libraryprogram-2-
GitHub - jasonpark112/eclipse-jar-libraryprogram-2-
Contribute to jasonpark112/eclipse-jar-libraryprogram-2- development by creating an account on GitHub.
github.com
여기에서 찾을 수 있고, 이클립스에서는 파일을 찾을 수 없다고 하지만, jar 이 파일을 찾는 방식에서는 이 코드가 돌아간다.
이번 계기로 경로에 대한 이해도를 높일 필요가 있음을 알았다.