본문 바로가기

Study/Gradle

[Gradle] War 플러그인

반응형

내용은 그레이들 홈페이지에서 제시된 Groovy 문법과 Kotlin 문법 중 Groovy 문법만 작성했다.

War 플러그인

War 플러그인은 웹 애플리케이션 WAR 파일들을 결합하기 위한 Java 플러그인의 확장한다.

War 플러그인은 Java 플러그인의 기본 JAR 아카이브 파일 생성을 비활성화 시키고 WAR 아카이브 태스크(task)를 기본 동작으로 추가한다.


사용법

War 플러그인을 사용하기 위해서는 아래의 내용을 빌드 스크립트에 포함해야 한다.

plugins {
    id 'war'
}

프로젝트 구성

표준 자바 프로젝트 레이아웃에다가 War 플러그인이 아래의 내용을 더한다

 

src/main/webapp

  • 웹 애플리케이션 소스 경로

태스크

War 플러그인은 아래의 태스크들을 더하거나 수정한다.

 

war - War 플러그인의 속성

  • 의존 관계 : compile 태스크에 의존한다.
  • 애플리케이션 WAR 파일으로 결합한다.

 

assemble - lifecycle task

  • 의존 관계 : war 태스크에 의존한다.

War 플러그인은 태스크를 수행하기 위해 Java 플러그인을 통해 아래의 의존들을 더한다. 

 

War 플러그인의 태스크들


의존 관리

War 플러그인은 두 개의 의존 구성을 더한다.

  • providedCompile
  • providedRuntime

providedCompile과 providedRuntime은 WAR 저장소에 추가되지 않는 것을 제외하고 각각 compileruntime과 동일한 범위를 갖고 있다.

 

이런 provided 구성들은 개별로 동작한다는 것이 중요하다. 

commons-httpclient:commons-httpclient:3.0를 어떤 provided 구성으로든 추가했다고 가정하자. 이 의존은 commons-codec에 의존한다. commons-codec 라이브러리가 당신의 compile 구성에 명시적으로 의존하게 설정되어 있더라도 provided 구성이기 때문에 이러한 의존들은 WAR에 추가되지 않는다.

 

만약 이런 의존성 전이 형태를 원하지 않는다면 간단하게 당신의 provided 의존들을 commons-httpclient:commons-httpclient:3.0@jar 처럼 선언하면된다.

provided는 war 외부에 라이브러리 파일(jar 파일)이 있을 때 사용할 수 있다. provided로 선언한 의존 설정은 War 플러그인의 태스크를 수행 후 생성되는 war파일 내에 포함되지 않는다.

위의 예에서 설명한 commons-httpclient:commons-httpclient:3.0이 providedCompile 또는 providedRuntime으로 설정되어 있을 때 war 파일에 추가되지 않는 이유가 이것 때문이다.

provided로 선언한 의존 설정은 웹 애플리케이션의 라이브러리 폴더(일반적으로 /WEB-INF/lib 폴더)에 추가되어 있다면 lib 폴더에 있는 jar 라이브러리 파일들을 읽어서 실행할 수 있다.

컴파일, war 생성 등 모든 상황에서 사용하고 싶다면 implementation으로 설정하면 된다.

참고 링크 : https://stackoverflow.com/questions/30731084/provided-dependency-in-gradle
Gradle 3.4 버전부터 Java 플러그인에 구성이 추가됐다.
compile 대신 implementation 또는 api를 사용해야 한다.
runtime 대신 runtimeOnly를 사용해야 한다.

참고 링크 : https://docs.gradle.org/3.4/release-notes.html#the-java-library-plugin

공개(publishing)

components.web

  • war 태스크를 수행하면 프로덕션 WAR를 생성(publishing)하기 위한 소프트웨어컴포넌트(SoftwareComponent)가 생성된다.

프로퍼티 규약(Convention)

webAppDirName - String 타입

  • 기본값 : src/main/webapp
  • 웹 애플리케이션 소스 경로, 프로젝트 디렉토리와 관계된 이름

webAppDir - (읽기 전용) File 타입

  • 기본값 : $webAppDirName (예 : src/main/webapp)
  • 웹 애플리케이션 소스 디렉토리의 경로

WarPluginConvention 오브젝트가 프로퍼티들을 제공한다.


War

War 태스크의 기본 동작은 아카이브의 루트 경로에서 상대경로인 src/main/webapp의 컨텐츠들을 복사하는 것이다. 보통 webapp 디렉토리는 WEB-INF 디렉토리의 하위 디렉토리에서 web.xml 파일을 포함하고 있다. 컴파일된 클래스들은 WEB-INF/classes에 있다. 모든 runtime 구성의 디펜던시들은 WEB-INF/lib로 복사된다.

 

API 문서의 War 클래스는 유용한 추가 정보들을 포함하고 있다.


실습 예제(Customizing)

가장 중요한 옵션들을 사용한 예제

configurations {
    moreLibs
}

repositories {
    flatDir {
        dirs "lib"
    }
    jcenter()
}

dependencies {
    implementation 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"
    }
    runtimeOnly ":runtime:1.0"
    providedRuntime ":providedRuntime:1.0@jar"
    testImplementation "junit:junit:4.13"
    moreLibs ":otherLib:1.0"
}

war {
    from 'src/rootContent' // adds a file-set to the root of the archive
    webInf { from 'src/additionalWebInf' } // adds a file-set to the WEB-INF dir.
    classpath fileTree('additionalLibs') // adds a file-set to the WEB-INF/lib dir.
    classpath configurations.moreLibs // adds a configuration to the WEB-INF/lib dir.
    webXml = file('src/someWeb.xml') // copies a file to WEB-INF/web.xml
}

 

원문 : docs.gradle.org/current/userguide/war_plugin.html

 

반응형