====== 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]]