====== Gradle Web(War) Plugin ======
apply plugin: 'war'
* [[http://www.gradle.org/docs/current/userguide/war_plugin.html|War Plugin]]
* 웹 애플리케이션 리소스 기본 디렉토리 : ''src/main/webapp''
* ''webAppDirName'' 값을 프로젝트에 상대적인 디렉토리로 지정하면 웹 애플리케이션 리소스의 디렉토리를 변경할 수 있다.
* [[gradle:jetty]] 참조
===== 태스크 =====
* [[http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.bundling.War.html|War]] ''war'' 태스크가 하나 추가된다. ''compile'' 태스크에 의존한다.
* War Plugin은 Java Plugin의 ''assemble'' 태스크가 ''war'' 태스크에 의존하도록 변경한다.
===== 프로젝트 레이아웃 =====
* ''src/main/webapp'' : 웹 애플리케이션 소스. ''webAppDirName'' 값으로 조정
===== 의존성 관리 =====
* War Plugin은 두가지 의존성을 추가한다. 아래는 ''compile'', ''runtime'' configuration과 동일한 스코프이지만, WAR 압축파일에는 추가되지 않는다.
* ''providedCompile''
* ''providedRuntime''
* providedXXX는 이행성 설정이다. 어떤 라이브러리가 provided로 설정되면 그것이 의존하는 다른 라이브러리도 자동으로 provided가 된다. 강제로 compile 로 지정해도 상관없다.
* 이행성을 없애려면 의존성 지정시 ''commons-httpclient:commons-httpclient:3.0**@jar**'' 처럼 끝에 ''@jar''를 붙인다.
// 기본 Servlet API
dependencies {
providedCompile 'javax.servlet:servlet-api:2.5'
}
특정 라이브러리가 servlet-api를 compile 스코프로 이미 가지고 있는 상황에서는, 해당 라이브러리 의존성에서 exclude를 해준다.
dependencies {
compile('some:library:1.0') {
exclude group: 'javax.servlet', module: 'servlet-api'
}
providedCompile 'javax.servlet:servlet-api:2.5'
}
===== Convention Properties =====
* [[http://www.gradle.org/docs/current/dsl/org.gradle.api.plugins.WarPluginConvention.html|WarPluginConvention]] 참조.
^프라퍼티이름 ^타입 ^기본값 ^설명 ^
|webAppDirName | String | src/main/webapp | 웹 애플리케이션 소스 디렉토리의 이름. 프로젝트 디렉토리에 상대경로 |
|webAppDir | File | //projectDir/////webAppDirName// | 웹 애플리케이션 소스 디렉토리 |
===== war 태스크 =====
* [[http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.bundling.War.html|War]] ''war'' 태스크는 //src/main/webapp//의 컨텐츠를 war 파일의 루트로 복사한다. ''webapp'' 디렉토리는 ''WEB-INF''를 포함하고 있어야 한다. ''WEB-INF''는 ''web.xml''을 포함해야 한다.
* 컴파일된 클래스는 ''WEB-INF/classes''로 복사된다.
* 모든 runtime 의존성 라이브러리들을 ''WEB-INF/lib''로 복사된다.
* war 파일명에서 version 빼기
war {
archiveName = "${baseName}.${extension}" // projectName.war
}
===== 압축 풀린 war =====
* war 태스크는 기본적으로 압축한 ''*.war''파일을 생성한다. 압축 안한 웹 애플리케이션이 필요하다면,
task explodedWar(type: Copy) {
description = 'Generate exploded war'
group = 'build'
dependsOn war.dependsOn
into "${buildDir}/exploded"
with war
}
* 이 방식은 war가 의존성이 걸린 것이 있을 때 무시해 버린다. 따라서 **war에 걸린 의존성을 explodedWar에도 걸어줘야 한다**.
* 혹은 war 마지막에 압축을 풀도록 설정도 가능
war.doLast {
ant.unzip(src: war.archivePath, dest: "${buildDir}/exploded")
}
===== War 커스터마이징 =====
configurations {
moreLibs
}
repositories {
flatDir { dirs "lib" }
mavenCentral()
}
dependencies {
compile module(":compile:1.0") {
dependency ":compile-transitive-1.0@jar"
dependency ":providedCompile-transitive:1.0@jar"
}
providedCompile "javax.servlet:servlet-api:2.5"
providedCompile module(":providedCompile:1.0") {
dependency ":providedCompile-transitive:1.0@jar"
}
runtime ":runtime:1.0"
providedRuntime ":providedRuntime:1.0@jar"
testCompile "junit:junit:4.8.2"
moreLibs ":otherLib:1.0"
}
war {
from 'src/rootContent' // 웹 애플리케이션 루트에 지정된 경로 이하의 파일 셋 추가, into에 웹 애플리케이션 루트에 상대적인 경로로 복사될 목표 디렉토리 지정 가능.
webInf { from 'src/additionalWebInf' } // WEB-INF에 지정된 파일셋 추가, into에 WEB-INF에 상대적인 경로로 복사될 목표 디렉토리 지정 가능.
classpath fileTree('additionalLibs') // WEB-INF/lib 에 지정된 파일셋 추가
classpath configurations.moreLibs // WEB-INF/lib 에 지정된 구성 추가
webXml = file('src/someWeb.xml') // WEB-INF/web.xml 로 복사
}
===== 참조 =====
* [[http://java.dzone.com/articles/gradle-goodness-adding|Gradle Goodness: Adding Dependencies Only for Packaging to War]]