| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @BeforeAll
- @BeforeEach
- @Builder
- @Entity
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Query
- @Table
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- api gateway 설계
- api gateway 필터
- ApplicationEvent
- argocd
- assertThat
- async/await
- AVG
- AWS
- aws autoscaling
- aws eks
- aws iam role
- AWS KMS
- Today
- Total
기록
Gradle test 먼저 실행했더니 실패한 이유: JDK와 javac의 함정 본문
1. 테스트만 먼저 하고 싶은 욕심
CI 파이프라인을 설정하면서 gradle build는 시간이 너무 오래 걸려서, 먼저 gradle test만 실행해보는 경우가 많다. 전체 빌드가 아니라 테스트만 확인하면 더 빠르게 문제를 캐치할 수 있기 때문이다.
나도 Jenkins에서 프로젝트 빌드 전에 먼저 테스트만 돌려보기 위해 아래와 같은 스크립트를 작성했다.
./gradlew test
그런데 의외로 아주 기본적인 부분에서 에러가 발생했다. 분명 로컬에서는 잘 돌아가던 테스트가 Jenkins에서는 아래처럼 터진다:
2. 발생한 에러 메시지
> Could not determine the dependencies of task ':test'.
> Could not resolve all dependencies for configuration ':testRuntimeClasspath'.
> Failed to calculate the value of task ':compileTestJava' property 'javaCompiler'.
> Toolchain installation '/usr/lib/jvm/java-17-amazon-corretto.x86_64' does not provide the required capabilities: [JAVA_COMPILER]
처음엔 testRuntimeClasspath 문제가 아닌가 싶었지만, 핵심은 이 메시지였다:
Toolchain installation does not provide the required capabilities: [JAVA_COMPILER]
즉, Gradle이 내부적으로 컴파일러를 찾고 있는데, 설정된 자바 설치 경로에는 컴파일러가 없다는 말이다.
3. javac가 없다고?
직감적으로 Jenkins에서 사용하는 Java 환경을 확인해봤다. Jenkins 로그에는 이렇게 찍혀 있었다:
+ java -version
openjdk version "17.0.11" 2024-04-16 LTS
OpenJDK Runtime Environment Corretto-17.0.11.9.1
OpenJDK 64-Bit Server VM Corretto-17.0.11.9.1
+ javac -version
javac: command not found
java는 잘 설치돼 있는데, javac가 없다. 이 말은 곧 JDK가 아닌 JRE만 설치돼 있다는 뜻이다.
4. 왜 javac가 없으면 문제가 되나?
Gradle은 테스트 실행 전에 compileTestJava라는 태스크를 실행한다.
이 작업은 src/test/java 안의 테스트 코드를 컴파일하기 위한 단계다. 즉, 테스트 전에 컴파일이 선행되어야 하고, 이 컴파일은 javac로 이뤄진다.
만약 시스템에 javac가 없다면 Gradle은 테스트 코드를 컴파일하지 못하고, 따라서 테스트도 실행할 수 없다.
Gradle 7부터는 Java Toolchain 기능을 통해 적절한 Java 버전을 자동으로 찾으려 하지만, 그 toolchain 경로 안에도 javac가 없으면 결국 실패하게 된다.
5. JRE와 JDK의 차이
이 문제는 결국 Java 설치의 개념 차이에서 비롯된다.
구분 JRE JDK
| 포함 항목 | java만 포함 | java, javac, javadoc 등 개발 도구 포함 |
| 용도 | 실행 전용 | 개발 및 컴파일용 |
| 사용 예 | 배포 서버 | 개발/빌드 환경 |
CI 환경에선 코드를 컴파일하고, 테스트하고, 패키징까지 해야 하므로 JDK가 필요하다.
JRE만 설치돼 있으면 빌드가 불가능하다.
6. 해결 방법: JDK 설치하기
✅ Ubuntu 계열
sudo apt update
sudo apt install -y java-17-amazon-corretto-jdk
✅ Amazon Linux
sudo yum install -y java-17-amazon-corretto-devel
설치 후, 다음 명령어로 확인:
javac -version
7. Jenkins 환경 변수 설정 (선택)
만약 여러 Java 버전이 공존하거나, 명시적으로 설정하고 싶다면 Jenkins 파이프라인에서 환경변수를 지정하는 것도 방법이다.
environment {
JAVA_HOME = '/usr/lib/jvm/java-17-amazon-corretto'
PATH = "${JAVA_HOME}/bin:${env.PATH}"
}
혹은 Jenkins의 "Global Tool Configuration"에서 JDK를 등록하고, Job에서 해당 이름으로 지정할 수도 있다.
8. 정리하며
Gradle에서 test만 실행하고 싶은 건 매우 흔한 요구지만, 이때도 **컴파일 가능한 환경(JDK)**이 갖춰져 있어야 한다.
CI 환경에서는 JRE만 깔려 있는 경우가 종종 있어서, 이런 문제가 터지기 쉽다.
JDK는 선택이 아니라 필수다.
빌드 파이프라인을 구성할 때는 반드시 JDK가 설치돼 있고, javac가 정상적으로 실행되는지 먼저 확인해보자.
'DevOps' 카테고리의 다른 글
| K3s 기반 멀티 노드 클러스터 구축기 (1) - 컨트롤 플레인 자동화와 Helm 설치까지 (0) | 2025.04.14 |
|---|---|
| K3s 기반 멀티 계정 클라우드 인프라 설계 (AWS Free Tier 최적화) (0) | 2025.04.14 |
| AWS 프리티어로 ECS on EC2 구성하기 (CloudFormation 기반 자동화) (0) | 2025.04.01 |
| Makefile 사용법과 매개변수 전달 방법 정리 (0) | 2025.03.26 |
| AWS에서 민감 정보 안전하게 관리하기: Parameter Store (0) | 2025.01.29 |