[Java] Java jar 파일에서 리소스 파일 경로 사용하는 법

2025. 5. 18. 18:26·개발 (Development)/Java

Java 프로젝트를 jar 파일로 패키징한 뒤 실행할 경우, 개발 중에는 문제없던 리소스 파일 경로에서 오류가 발생하는 경우가 많습니다. 특히 설정 파일, 쿼리 템플릿 등 리소스 파일을 다룰 때 자주 마주치는 문제입니다. 그 원인과 해결 방법을 단계적으로 정리해보았습니다.

1. 개발 중엔 되는데, 배포 후 오류?

개발 환경에서는 다음과 같은 코드로 파일을 불러와도 문제가 없습니다.

File file = new File("src/main/resources/config/config.json");

하지만 jar 파일로 패키징한 후 실행하면 FileNotFoundException이 발생합니다. 이는 jar 내부에 있는 리소스는 실제 파일이 아니라 classpath 내에 존재하기 때문입니다.

2. jar 내부 리소스는 ClassLoader로

jar 내부 파일은 File이 아니라 ClassLoader를 사용해 읽어야 합니다.

InputStream is = getClass().getClassLoader().getResourceAsStream("config/config.json");

또한 다음과 같이 내용을 문자열로 변환할 수 있습니다.

try (InputStream is = getClass().getClassLoader().getResourceAsStream("config/config.json")) {
    if (is == null) throw new FileNotFoundException("리소스를 찾을 수 없습니다.");
    String content = new String(is.readAllBytes(), StandardCharsets.UTF_8);
}

3. 쓰기 작업은 외부 경로 사용

로그, 업로드 파일처럼 쓰기 작업이 필요한 파일은 외부에 두고 접근해야 합니다.

Path path = Paths.get(System.getProperty("user.dir"), "config/config.json");

이 방식은 파일을 읽고 쓸 수 있으며, 실행 환경에 따라 경로 설정이 유연합니다.

4. 실무에서는 이렇게 나눠 씁니다

파일 용도 위치 접근 방식
읽기 전용 (설정, 쿼리 등) resources 폴더 ClassLoader
읽고 쓰기 (로그, 업로드 등) 외부 디렉토리 File 또는 Path

프로젝트의 성격과 리소스의 용도에 따라 위처럼 구분하면 운영 환경에서도 안정적인 동작을 기대할 수 있습니다.

5. 요약

jar 파일 실행 환경에서는 리소스를 불러오는 방식이 다릅니다.

  • 내부 리소스: ClassLoader 사용
  • 외부 파일: File, Path 사용

읽기와 쓰기 용도를 명확히 구분해 적용하는 것이 핵심입니다.

반응형

'개발 (Development) > Java' 카테고리의 다른 글

[Java] printStackTrace() 경고 해결 및 로깅 적용하기  (0) 2025.06.28
[Java/Spring Boot] AWS 환경에서 DB 직접 접근이 어려운 경우: Java 애플리케이션에서 SQL 파일을 실행하여 데이터 삽입하기  (2) 2025.05.18
[Java/Spring Boot] Spring Boot + MyBatis 환경에서 쿼리 조회용 API를 만들기 전에 꼭 고려해야 할 5가지  (2) 2025.05.18
[Java] 사내망에서 Gradle 빌드 시 PKIX 인증서 오류 해결기 (feat. 프록시 & 인증서 등록)  (0) 2025.04.19
[Java/SpringBoot] Kubernetes 환경에서 Spring Boot 로그를 Pod별로 Rolling 하도록 설정  (0) 2025.04.19
'개발 (Development)/Java' 카테고리의 다른 글
  • [Java] printStackTrace() 경고 해결 및 로깅 적용하기
  • [Java/Spring Boot] AWS 환경에서 DB 직접 접근이 어려운 경우: Java 애플리케이션에서 SQL 파일을 실행하여 데이터 삽입하기
  • [Java/Spring Boot] Spring Boot + MyBatis 환경에서 쿼리 조회용 API를 만들기 전에 꼭 고려해야 할 5가지
  • [Java] 사내망에서 Gradle 빌드 시 PKIX 인증서 오류 해결기 (feat. 프록시 & 인증서 등록)
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (220) N
      • 개발 (Development) (154) N
        • Algorithm (1)
        • Angular (1)
        • AWS (5) N
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (30)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7) N
        • PostgreSQL (37)
        • Python (27) N
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (10)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (11) N
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ADsP
    deepseek
    JSON
    PostgreSQL
    Vue.js
    Linux
    python
    docker
    백준자바
    JPA
    javascript
    백준알고리즘
    리눅스 마스터 2급
    MyBatis
    리눅스 마스터 2급 2차
    pandas
    DevOps
    typescript
    springboot
    timescaledb
    Kubernetes
    Linux master
    자바
    오답노트
    java
    데이터분석
    Kafka
    백준
    백준온라인저지
    AWS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Java] Java jar 파일에서 리소스 파일 경로 사용하는 법
상단으로

티스토리툴바