인용: https://wonyong-jang.github.io/devops/2022/07/17/DevOps-gradle.html
복습.
build.libs ==>> .\gradlew clean build, 즉, 빌드된 결과물이 담기는 폴더이다. plain은 말그대로 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고, 순수하게 작성된 소스코드의 클래스 파일과 리소스 파일만 포함한다. 반면 plain 키워드가 없는 jar파일을 executable archive 라고 하며, 어플리케이션 실행에 필요한 모든 의존성을 함께 빌드한다.
Gradle Wrapper가 쓰이는 가장 강력한 장점이자 이유는 Java 프로젝트를 CI(Continuous Integration) 환경에서 빌드할 때 CI 환경을 프로젝트 빌드 환경과 매번 맞춰줄 필요가 없는 이유가 바로 Gradle Wrapper를 사용하기 때문이다. 어떻게 Gradle Wrapper를 사용하면 이렇게 CI(지속적 통합)환경과 관련없이 환경에 종속되지 않고 프로젝트를 빌드할 수 있는 것일까? GradleWrapper는 운영체제에 맞춰서 Gradle Build를 수행하는 배치 스크립트(gradlew)이기 때문이다.
gradle build를 사용하면 로컬에 설치된 gradle과 java를 기준으로 build하고, ./gradlew build를 실행하면 build.gradle파일에 정의한 내용을 기준으로 build되기 때문에 로컬 환경과 관계없이 프로젝트를 빌드할 수 있다.
Gradle 프로젝트를 생성하면 기본적으로 아래와 같은 gradle 폴더가 생기게 된다.
.
├── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
Gradle을 사용하는 프로젝트에는 위와 같은 Wrapper 파일들이 존재한다
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
1. Gradle Wrapper란?
Gradle 빌드에 권장되는 사용 방법은 Gradle Wrapper를 사용하는 것이다.
Gradle에는 Wrapper라고 하는 운영체제에 맞춰서 Gradle Build를 수행하도록 하는 배치 스크립트가 있다.
즉, Gradle Wrapper는 명시된 gradle 버전을 호출하고 명시된 버전의 gradle이 없을 경우 자동으로 다운로드 및 설치하여 빌드해 해주는 스크립트이다.
결과적으로 수동 설치 프로세스를 수행하지 않고도 Gradle 프로젝트를 신속하게 시작할 수 있다.
Java 프로젝트를 CI 환경에서 빌드할 때 CI 환경을 프로젝트 빌드 환경과 매번 맞춰줄 필요가 없는 이유가 바로 Gradle Wrapper를 사용하기 때문이다.
환경에 종속되지 않고 프로젝트를 빌드할 수 있는데 이런 점이 Gradle이 가진 강력한 특징중 하나이다.
// Window
$ gradlew [task]
// Linux, OSX
$ ./gradlew [task]
gradle build를 사용하면 로컬에 설치된 gradle과 java를 기준으로 build하고, ./gradlew build를 실행하면 build.gradle파일에 정의한 내용을 기준으로 build되기 때문에 로컬 환경과 관계없이 프로젝트를 빌드할 수 있다.
Gradle 프로젝트를 생성하면 기본적으로 아래와 같은 gradle 폴더가 생기게 된다.
.
├── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
Wrapper를 사용하는 프로젝트에는 위와 같은 Wrapper 파일들이 존재한다.
gradle-wrapper.properties
아래는 Wrapper 설정 파일이며, gradle, path, version, proxy 설정 등의 정보를 저장할 수 있다.
distributionUrl에 지정되어 있는 gradle 버전을 사용하여 빌드를 하게 된다.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
gradle-wrapper.jar
명시된 Gradle 배포 버전을 포함하고 있는 Wrapper Jar파일이다.
gradlew, gradlew.bat
Wrapper를 빌드할 때 실행할 배치 스크립트이다.
2. Plain jar 와 Executable jar
위에서 gradle build를 살펴봤었고, 그 결과물로 jar파일을 확인할 수 있다.
참고로, 스프링 부트 2.5부터 gradle 빌드 시 jar파일이 2개가 생성는데 이에 대해서 살펴보자.
별도의 설정을 하지 않았을 때는 아래와 같이 2개의 jar파일이 생성된다.
프로젝트 이름-버전.jar
프로젝ㅌ 이름-버전-plain.jar
2-1) Plain Archive
plain이 붙은 jar파일을 plain archive라고 한다.
여기서 archive는 jar이든 war이든 빌드 결과물을 의미한다.
plain archive는 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고, 작성된 소스코드의 클래스 파일과 리소스 파일만 포함한다.
이렇게 생성된 jar파일을 plain jar, standard jar, thin jar라고 한다.
모든 의존성이 존재하는게 아니기 때문에 plain jar는 “java -jar” 명령어로 실행 시 에러가 발생한다.
build.gradle 파일에 아래와 같이 설정을 추가하면 plain jar 생성을 제외한다.
jar {
enabled = false
}
2-2) Executable Archive
반면 plain 키워드가 없는 jar파일을 executable archive 라고 하며, 어플리케이션 실행에 필요한 모든 의존성을 함께 빌드한다.
이렇게 생성된 executable jar는 fat jar라고도 한다.
모든 의존성을 포함하기 때문에 java -jar 명령어를 통해 실행 가능하다.