# `java`, `java-library`, `application`, `war` 플러그인 Gradle은 다양한 **플러그인(Plugin)**을 제공하여 프로젝트의 빌드, 실행, 배포 과정을 자동화할 수 있도록 돕는다. 그중에서도 Java 프로젝트를 위한 `java`, `java-library`, `application`, `war` 플러그인은 각각 **일반 Java 애플리케이션, 라이브러리, 실행형 애플리케이션, 웹 애플리케이션**을 관리하는 데 사용된다. ## `java` 플러그인 `java` 플러그인은 **일반적인 Java 프로젝트**를 빌드할 때 사용된다. 이 플러그인을 적용하면 **컴파일, 테스트, JAR 생성, 패키징** 등의 작업을 자동으로 수행할 수 있다. `build.gradle.kts` : ```kotlin plugins { java } group = "com.example" version = "1.0.0" repositories { mavenCentral() } dependencies { implementation("org.apache.commons:commons-lang3:3.12.0") testImplementation("junit:junit:4.13.2") } ``` ### 주요 태스크 | 태스크 | 설명 | |--------|--------------------------------| | `compileJava` | Java 소스 코드 컴파일 | | `processResources` | `src/main/resources/`의 리소스를 `build` 폴더로 복사 | | `classes` | `compileJava` + `processResources` 실행 | | `jar` | JAR 파일 생성 (`build/libs/`에 저장됨) | | `test` | 단위 테스트 실행 | | `clean` | `build/` 디렉터리 삭제 | | `build` | 전체 빌드 (`compileJava`, `test`, `jar` 포함) | ## `java-library` 플러그인 `java-library` 플러그인은 **라이브러리 개발**을 위한 플러그인으로, `java` 플러그인의 확장판이다. - `api`와 `implementation` 의존성을 구분할 수 있도록 지원한다. ### `api` vs `implementation` - **`api`** : 외부 프로젝트에서도 접근할 수 있는 공개 API - **`implementation`** : 내부에서만 사용하는 의존성 `build.gradle.kts` ```kotlin plugins { `java-library` } group = "com.example" version = "1.0.0" repositories { mavenCentral() } dependencies { api("com.google.guava:guava:32.0.1-jre") // 외부 프로젝트에서도 사용 가능 implementation("org.apache.commons:commons-lang3:3.12.0") // 내부에서만 사용 } ``` ### 주요 태스크 | 태스크 | 설명 | |--------|--------------------------------| | `assemble` | JAR 파일 생성 | | `publish` | 라이브러리를 배포 (예: Maven Central) | ## `application` 플러그인 `application` 플러그인은 **실행 가능한 Java 애플리케이션**을 만들기 위해 사용된다. - `mainClass`를 지정하여 `run` 태스크를 사용할 수 있다. `build.gradle.kts` ```kotlin plugins { application } group = "com.example" version = "1.0.0" repositories { mavenCentral() } dependencies { implementation("org.apache.commons:commons-lang3:3.12.0") } application { mainClass.set("com.example.Main") // 실행할 메인 클래스 } ``` ### 주요 태스크 | 태스크 | 설명 | |--------|--------------------------------| | `run` | 애플리케이션 실행 | | `installDist` | 실행 가능한 배포 패키지 생성 (`build/install/`) | | `distZip` | `.zip` 패키지로 애플리케이션 배포 | | `distTar` | `.tar` 패키지로 애플리케이션 배포 | ## `war` 플러그인 `war` 플러그인은 **웹 애플리케이션(WAR 파일) 배포를 위한 플러그인**이다. - **Servlet 기반 웹 애플리케이션을 패키징**할 때 사용된다. - `java` 플러그인을 자동으로 포함한다. `build.gradle.kts` ```kotlin plugins { war } group = "com.example" version = "1.0.0" repositories { mavenCentral() } dependencies { providedCompile("javax.servlet:javax.servlet-api:4.0.1") // 컨테이너가 제공하는 의존성 implementation("org.springframework:spring-webmvc:5.3.23") // 웹 MVC 프레임워크 } ``` ### 디렉터리 구조 ``` src/ ├── main/ │ ├── java/ <-- Java 소스 코드 │ ├── resources/ <-- 정적 리소스 │ ├── webapp/ <-- `WEB-INF` 및 JSP 파일 │ ├── WEB-INF/ │ │ ├── web.xml │ ├── index.jsp ``` ### 주요 태스크 | 태스크 | 설명 | |--------|--------------------------------| | `war` | WAR 파일 생성 (`build/libs/app-1.0.0.war`) | | `explodedWar` | 압축되지 않은 WAR 파일 생성 | | `assemble` | 전체 빌드 실행 | ## 플러그인 비교 정리 | 플러그인 | 용도 | 실행 방식 | 주요 태스크 | |----------|--------|------------|------------------------------| | `java` | 일반 Java 프로젝트 | 실행 X, JAR만 생성 | `compileJava`, `jar`, `build` | | `java-library` | 라이브러리 개발 | 실행 X, API 관리 | `publish`, `jar`, `build` | | `application` | 실행 가능한 앱 | `run`으로 실행 가능 | `run`, `installDist`, `distZip` | | `war` | 웹 애플리케이션 | WAR 파일 생성 | `war`, `explodedWar` |