빌드란 다음과 같은 동작을 수행하는 일을 말한다
필요한 라이브러리를 다운 받고 *classpath에 추가
소스 코드를 컴파일
테스트를 실행
컴파일된 코드를 패키지(jar, war, zip 등)
패지키된 파일을 주로 artifact라고 부르고 서버나 레포지토리에 배포
*classpath : 사용자 정의 클래스 및 API 패키지의 경로를 지정하는 자바가상머신 또는 Java 컴파일러의 매개 변수
수동으로 빌드하고 실행하는 과정을 정말 귀찮다. 이런 과정을 자동화하기 위해 빌드 툴이 고안됐다
ex) Ant, Maven, Gradle
자바에서는 이전에 Maven이 널리 사용되었지만, 다양한 언어를 지원하는 Gradle이 떠오르며 최근에는 Gradle이 널리 사용되고 있다
빌드 툴은 프로젝트에서 필요한 xml, properties, jar 같은 파일들을 인식하여 빌드하고, 컴파일과 테스트하여 실행가능한 앱으로 빌드해준다
프로젝트 정보 관리, 테스트 빌드, 배포 등의 작업도 진행해준다
그루비를 이용한 빌드 자동화 시스템
그루비 : 자바에 파이썬, 루비, 등의 특징을 더한 동적 객체 지향 프로그래밍 언어
https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_%EA%B7%B8%EB%A3%A8%EB%B9%84
최근에는 Kotlin도 지원한다
Gradle 공식 문서에서는 Gradle의 특징을 다음과 같이 설명한다
https://docs.gradle.org/current/userguide/what_is_gradle.html
$ sdk install gradle
$ brew install gradle
$ gradle init # gradle로 프로젝트 생성. 몇가지 설정들을 선택해주면 된다
$ tree # 기본 gradle 생성 자바 프로젝트는 다음과 같은 구조를 가진다
├── app # 기본 프로젝트 명
│ ├── build.gradle # 빌드 스크립트를 작성하는 곳
│ └── src # 소스 코드
│ ├── main # 프로그램 코드
│ │ ├── java
│ │ │ └── com
│ │ │ └── programmers
│ │ │ └── java
│ │ │ └── App.java
│ │ └── resources
│ └── test # 테스트 코드
│ ├── java
│ │ └── com
│ │ └── programmers
│ │ └── java
│ │ └── AppTest.java
│ └── resources
├── gradle # gradle 실행을 위한 런타임
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle # gradle 설정 파일
$ gradle build
Starting a Gradle Daemon (subsequent builds will be faster)
BUILD SUCCESSFUL in 5s
7 actionable tasks: 7 up-to-date
$ gradle run
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 725ms
2 actionable tasks: 1 executed, 1 up-to-date
(...생략...)
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
gradle init
에서 application을 선택했다면 plugin에서 application이 추가되고 다음과 같은 task들이 자동으로 등록된다 $ gradle tasks
> Task :tasks
------------------------------------------------------------
Tasks runnable from root project 'HelloWorld'
------------------------------------------------------------
Application tasks
-----------------
run - Runs this project as a JVM application
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'HelloWorld'.
dependencies - Displays all dependencies declared in root project 'HelloWorld'.
dependencyInsight - Displays the insight into a specific dependency in root project 'HelloWorld'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
outgoingVariants - Displays the outgoing variants of root project 'HelloWorld'.
projects - Displays the sub-projects of root project 'HelloWorld'.
properties - Displays the properties of root project 'HelloWorld'.
tasks - Displays the tasks runnable from root project 'HelloWorld' (some of the displayed tasks may belong to subprojects).
Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>
파이썬에서 pip로 외부 라이브러리를 설치하는 것처럼, Gradle에서는 build.gradle의 repositories와 dependencies 설정을 통해 설치할 수 있다.
다음 build.gradle의 일부분은 mavenCentral 레포의 몇몇 외부 dependency를 불러온다
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
implementation 'com.github.javafaker:javafaker:1.0.2'
}
import com.github.javafaker.Faker;
public class Main {
public static void main(String[] args) {
// 데모 등을 위해 다양한 랜덤 값을 생성하는 클래스
Faker faker = new Faker();
// 직함 생성
String title = faker.name().title();
System.out.println(title);
}
}
아쉽게도 내가 현재 사용중인 fish를 지원하지 않는다 😢 posix compliant한 쉘들만 지원하는거 같은데, 앞으로 gradle을 직접 실행할 일이 많다면 zsh을 설치하던가 해야겠다 .