Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

0과 1 사이

[Spring boot] JAR 파일에 application.yml 파일이 포함되지 않는 이유 본문

디버깅

[Spring boot] JAR 파일에 application.yml 파일이 포함되지 않는 이유

고후 2025. 2. 8. 23:07

Docker로 Spring boot application을 띄울 때 다음과 같이 application.yml 파일을 지정해줘야만 application.yml을 인식할 수 있었다. 지정하지 않으면 다음과 같은 오류가 발생함.

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

위 오류는 application.yml를 못읽을 때 발생하는 오류이다.

FROM openjdk:17.0.1-jdk-slim AS builder
LABEL authors="minjuko"

# 필요한 파일들만 복사
COPY gradlew . 
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
COPY application.yml .

# gradle 실행 권한 부여 및 빌드
RUN chmod +x ./gradlew
RUN ./gradlew bootJar

FROM openjdk:17.0.1-jdk-slim

# 빌드 결과물을 실행 컨테이너에 복사
COPY --from=builder build/libs/*.jar app.jar
COPY --from=builder application.yml .

# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.config.location=application.yml"]

 

그런데 다른 예시를 참조해보면 모두 ENTRYPOINT를 java -jar /app.jar로 설정하던데..

왜 나만 application.yml을 지정해줘야 하는걸까? 의문이 생겼다.

 

그 이유를 챗 GPT에게 물어본 결과..

 

ENTRYPOINT ["java", "-jar", "/app.jar"]
=> Spring Boot는 기본적으로 클래스패스(classpath)에 있는 application.yml 또는 application.properties 파일을 찾습니다. 이 경우, application.yml이 JAR 파일 내에 포함되어 있어야 합니다. 만약 application.yml을 외부 파일로 설정하려면 --spring.config.location을 명시적으로 지정해야 합니다.

 

그렇다면 나의 경우 application.yml이 JAR 파일 내에 포함이 안된다는 건데, 정말 그럴까? 확인해봤다.

 

JAR 파일 내에 application.yml이 포함되어있는지 여부는 다음 명령어로 확인해볼 수 있다.

 

jar tf gradle/wrapper/gradle-wrapper.jar                                                                                                [21:54:35]
META-INF/LICENSE
META-INF/MANIFEST.MF
org/gradle/cli/CommandLineArgumentException.class
org/gradle/cli/CommandLineOption.class
org/gradle/cli/CommandLineParser$AfterOptions.class
org/gradle/cli/CommandLineParser$BeforeFirstSubCommand.class
org/gradle/cli/CommandLineParser$KnownOptionParserState.class
org/gradle/cli/CommandLineParser$MissingOptionArgState.class
org/gradle/cli/CommandLineParser$OptionAwareParserState.class
org/gradle/cli/CommandLineParser$OptionParserState.class
org/gradle/cli/CommandLineParser$OptionString.class
org/gradle/cli/CommandLineParser$ParserState.class
org/gradle/cli/CommandLineParser$UnknownOptionParserState.class
org/gradle/cli/CommandLineParser.class
org/gradle/cli/ParsedCommandLine.class
org/gradle/cli/ParsedCommandLineOption.class
org/gradle/internal/file/PathTraversalChecker.class
org/gradle/util/internal/WrapperDistributionUrlConverter.class
org/gradle/wrapper/BootstrapMainStarter$1.class
org/gradle/wrapper/Download$DefaultDownloadProgressListener.class
org/gradle/wrapper/Download$ProxyAuthenticator.class
org/gradle/wrapper/Download.class
org/gradle/wrapper/ExclusiveFileAccessManager.class
org/gradle/wrapper/GradleUserHomeLookup.class
org/gradle/wrapper/GradleWrapperMain.class
org/gradle/wrapper/Install$1.class
org/gradle/wrapper/Install$InstallCheck.class
org/gradle/wrapper/Install.class
org/gradle/wrapper/Logger.class
org/gradle/wrapper/PathAssembler.class
org/gradle/wrapper/SystemPropertiesHandler.class
org/gradle/wrapper/WrapperConfiguration.class
org/gradle/wrapper/WrapperExecutor.class

진짜 없었다.

 

이유가 뭘까? 확인해보니 application.yml 파일은 src/main/resources 폴더에 위치해야 한다고 한다....... ^^

나도 처음엔 해당 위치에 있었는데 환경변수 파일 설정하다보니 루트로 옮겨버렸음..

 

스프링 초보라서 이런 실수를 했나보다.

IntelliJ는 application.yml가 root 경로에 있어도 잘 인식하던데, 그건 IDE가 똑똑해서 그런거고 docker는 다른것 같다.

 

결론:

항상 application.yml 파일은 src/main/resources 폴더에 위치시켜야 함

Comments