[debug log] build시 리소스 파일을 클래스 디렉터리(build/classes) 로 복사하지 않는 문제

무심코·2023년 3월 6일
0
post-thumbnail

문제 상황

테스트 코드를 작성하고 코드를 돌렸는데 다음과 같은 문제가 발생했다
error while writing GoalTest: could not create parent directories

해당 문제를 디버깅하는데 build시 :compileJava , :processResources, :classes 과정은 정상 작동했는데 :compileTestJava 부분은 정상작동하지 않는다는 것을 확인하였다.

문제가 되는 부분인 :compileTestJava 가 어떤 행위를 하는지 파악하기 위해 gradel에서의 build 과정을 먼저 살펴보았다. 현재 gradle(groovy)을 사용하고 있어 build.gradle을 기준으로 살펴보았다.

Build 과정

Gradle 이란

먼저 gradle이 무엇인지부터 상기하고 시작하자. gradle이란 Groovy를 사용하는 빌드 도구이다. 사실 더욱 명확하게는 Groovy기반 DSL(Domain Specific Language)를 사용하는 빌드 도구이다. DSL(Domain Specific Language)이란 특정 용도에 맞게 해당 언어를 각색한 것이다.

Gradle은 기본적으로 Task를 모아서 실행한다. Task는 다양한 Action을 내부에 가지고 있다 . 태스크를 실행하면 준비된 액션이 순서대로 실행되고 해당 액션들을 관리하는 것을 액션 리스트라고 한다.

Gradle steps

Gradle은 세가지 스탭으로 동작한다.

  1. Initialization
  2. Configuration
  3. Execution

Initialization

Gradle은 단일 및 다중 프로젝트 빌드를 지원한다. 초기화 단계에서 Gradle은 빌드에 참여할 프로젝트를 결정하고 이러한 각 프로젝트에 대한 Project 인스턴스를 만든다 .

Configuration

이 과정에서 빌드과정내의 모든 프로젝트의 빌드스크립트가 실행되고, 프로젝트 객체가 구성된다.

Execution

구성 단계에서 작성 및 구성된 태스크의 서브셋을 결정한다. (서브셋은 Gradle 커맨드 및 현재 디렉토리에 전달 된 태스크 이름 인수에 의해 결정된다.) 그 후, 선택된 작업을 실행한다.

build 폴더 내에 컴파일된 클래스 파일 및 jar파일 빌드 방법

compileJava : 자바 소스코드를 모두 컴파일한다. 보존할 장소(build/classes 폴더)가 없다면 폴더를 생성하고 그 안에 파일을 작성한다.

processResources : 리소스 파일을 클래스 디렉터리(classes) 안에 복사한다.

classes : 소스코드 컴파일과 리소스 파일 복사를 실행한다. 1,2번이 합쳐진것.

test : 프로그램 테스트를 실행한다. 소스 코드와 관련된 컴파일을 수행하고 테스트에 필요한 리소스 복사 등을 수행한 뒤 JUnit으로 테스트를 실해한다.

Javadoc : 소스코드를 해석하여 Javadoc 파일을 생성한다. build안의 docs 폴더 안에 Javadoc 폴더를 작성하여 파일을 보관한다.

clean : 빌드로 생성된 파일을 모두 삭제한다. 프로젝트를 처음부터 다시 빌드할 때 이용한다.

문제 분석

다음과 같이 /build/classes/.../test 디렉토리를 확인해보니 test 하려고 만든 디렉토리가 생성이 안돼있었다.

:compileJava:processResources:classes 는 정상 작동한것으로 보아 리소스 파일 중 테스트 관련 파일들을 클래스 디렉터리(build/classes) 안에 복사하는 것에 실패한 것으로 추측된다.

해결 방법

Preferences Build and run using , Run tests using 변경

다음과 같이 Preferences에서 Build and run usingRun tests using 부분을 Gradle에서 IntelliJ로 변경하면 문제가 해결된다.


다음은 build/classes에 정상적으로 생성된 test코드 리소스 파일이다

문제 원인

아직까지 정확한 원인은 모르겠다. 해당 문제를 해결 후 Gradle 상황에서 안되는 것들을 테스트 해보려고 Build and run usingRun tests using 부분을 Gradle로 다시 설정하고 테스트를 진행해봤는데 해당 문제가 다시 발생하지 않았다.

IntelliJ Build는 증분 빌드를 사용한다는 점에서 Gradle Build 와 차이가 있다. 증분 빌드란 용어 그대로 증분된 부분, 즉 변경된 부분만 빌드를 하는 방식으로 변경되지 않은 것에 대해서는 건너뛰고 빌드를 진행해서 빠른 빌드를 원할 경우 선택하는 방법이다. (그래서 IntelliJ 가 Gradle 보다 Build가 빠르다고 하는 것이다.)

이와 다르게 Gradle은 기존의 부분 + 변경된 부분을 모두 빌드하는 방식이다.

즉, Gradle이 모든 부분(기존의 부분 + 변경된 부분)을 Build하는 방식인데 해당 문제에서는 Gradle을 사용할때 문제가 발생했고 IntelliJ를 사용할때 문제가 해결되었다.

뭔가 뒷걸음질 치다가 문제를 해결한것 같은 느낌이 강하다. 해당 문제는 지속적으로 생각해보아야할 문제인 것 같다.

profile
지나치지 않기 위하여

0개의 댓글