plugins { id 'java' }
하는 일
- Java plugin은
자바 컴파일
,테스팅
,bundling capability
를 프로젝트에 추가해줌
Tasks 추가
- A
compileJava
task that compiles all the Java source files under src/main/java
- A
compileTestJava
task for source files under src/test/java
- A
test
task that runs the tests from src/test/java
- A
jar
task that packages themain
compiled classes and resources from src/main/resources into a single JAR named <project>-<version>.jar
- A
javadoc
task that generates Javadoc for themain
classes
Source Sets 추가(main
, test
소스 셋 추가함)
main
: JAR 파일로 컴파일 되고 조립되는 프로젝트의 프로덕션 소스코드를 포함함.
test
: JUNIT, TestNG를 이용해서 컴파일 되고 실행되는 테스트 소스 코드를 포함. 여기에는 주로 단위테스가 포함되지만, 같은 컴파일 classpath와 runtime classpath를 공유하는 한 어떠한 테스트라도 포함시킬 수 있음
- Source Set의 주요 아이디어는 소스 파일과 resource들이 타입에 의해 논리적으로 그룹핑된다는 것임. 예를 들어 어플리케이션 코드, 단위 테스트 코드, 통합 테스트 코드들에 대해. 각각의 논리적 그룹은 각각의 고유한 파일 의존성, classpath, 등등을 가지게 됨. 중요한 것은 source set을 구성하는 파일들은 같은 폴더에 위치할 필요가 없다는 것임
의존성 관리(Dependency Configuration을 통해)
- Gradle 프로젝트에 선언된 모든 의존성은 특정 범위에 대해 적용됨
- 임의의 의존성은 컴파일 할 때 필요한 반면, 다른 의존성은 런타임에만 필요할 수 있음
- Gradle은 Configuration의 도움으로 의존성의 scope를 정함
- 많은 Gradle plugin들은 미리 정의된 Configuration들을 프로젝트에 추가해줌

- implementation : 컴파일과 런타임에 다 필요한 의존성
- compileOnly : 컴파일 할 때만 필요한 의존성. 런타임에는 필요 없음
- annotationProcessor : 컴파일 할 때 사용되는 어노테이션 프로세서
- runtimeOnly : 런타임에만 필요한 의존성. 컴파일 시에는 필요 없음 (예 : h2 DB)
- runtimeOnly 라이브러리는 호환 가능한 라이브러리가 있으면 컴파일 이후에는 다른 호환 가능한 라이브러리로 교체하는 것이 가능합니다.(컴파일 하지 않고 라이브러리만 교체)
- testCompileOnly : 테스트를 컴파일 할 때 필요한 의존성
- testRuntimeOnly : 테스트를 수행할 때 필요한 런타임 의존성
Java Library Plugin
plugins { id 'java-library' }
- Java Plugin과 Java Library plugin 사이의 가장 큰 차이점은 Java Library plugin에서는 해당 프로젝트를 사용하는 client에게 노출되는(expose) API의 개념을 도입했다는 점임
- 다중 프로젝트 빌드에서 자주 사용하게 되는 케이스이고, 외부 의존성이 있을 때도 사용하게 됨
api
: 해당 configuration은 현재의 gradle project를 라이브러리 로써 이용할 때(i.e., other projects using the Java or the Java Library plugin), 해당 의존성이 노출되는 의존성일 때 사용함
implementation
: component 안에서 내부적으로 사용될 때, 사용하게 됨
api
로 선언된 의존성은 consumer의 라이브러리에 전이되어 노출되어transitively exposed), consumer의 컴파일 클래스패스에 나타나게 됨
implementation
으로 선언된 의존성은 consumer에게 노출되지 않고, 그래서 consumer의 컴파일 클래스패스에 나타나지 않음