構建Gradle範例項目之構建web項目

Gradle提供了開箱即用的插件,用來組裝WAR文件和將web應用部署到本地Servlet容器中。Gradle對構建和運行web應用都提供了擴展性支持。這裏咱們學習使用兩個web應用程序部署插件:WarJettyWar插件擴展自Java插件,爲web應用部署和組裝War包添加了約定和支持。Jetty是一個流行的輕量級開源web容器,它經過將一個HTTP模塊添加到應用中來提供一個嵌入式實現。Gradle的Jetty插件擴展了War插件,爲部署一個web應用到嵌入式容器和運行web應用提供了對應的任務。css

War插件java

咱們以前提到過War插件擴展自Java插件。實際上,這意味着你不須要在構建腳本中應用Java插件。它會自動由War插件引入不過即使你也應用了Java插件,這也不會對你的項目帶來其餘影響。應用插件是一個冪等操做,由於某一個指定的插件只會執行一次。當建立build.gradle文件中,使用插件只須要像這樣:web

apply plugin: 'war'

web應用默認約定的源代碼目錄是 src/main/webapp shell

另外,實現web應用所須要的類不可能徹底是java標準api,不少多是第三方庫裏的api。在運行構建以前,你須要確保聲明瞭外部依賴。War插件引入了兩個新的依賴配置項。例如,Servlet依賴使用到的配置項是 providedCompile。它表示該依賴在編譯時須要,可是運行時由環境提供。這裏的運行時環境是Jetty,tomcat這樣的Servlet容器。結果就是,被標記爲providedCompile的依賴不會打包到WAR文件中。像JSTL庫這樣的依賴,在編譯時不須要,可是運行時須要。它就要聲明爲runtime,它就會成爲WAR文件的一部分。示例:api

dependencies {
    providedCompile 'javax.servlet.servlet-api:2.5'
    runtime 'javax.servlet:jstl:1.1.2'
}

構建項目tomcat

在Gradle中構建一個web應用就和構建一個獨立運行的Java應用程序同樣。運行:閉包

$ gradle build

命令後,組裝的WAR文件能夠在 build/libs 目錄下找到。app

War插件確保組裝的WAR文件遵循由Java EE規範定義的標準結構。war任務將web應用源代碼目錄 src/main/webapp 的內容原封不動地拷貝到WAR文件的根目錄。編譯的class文件最終會放置在 WEB-INF/classes 下,經過依賴閉包定義的運行時類庫會放置在 WEB-INF/lib 下。注:默認狀況下,WAR文件的名字會繼承自項目的目錄名字。webapp

定製War插件jsp

即使你的項目沒有遵循Gradle的標準約定,該插件也依然能夠構建WAR文件。假設全部的靜態文件都放置在static目錄下(例如:css,js,jmg),並且全部web應用的內容都放置在webfiles目錄下(如:jsp,web.xml)。

下面的代碼片斷顯示瞭如何配置約定屬性。War插件暴露了 webAppDirName 約定屬性,默認值是 src/main/webapp,從新賦值就能夠輕鬆地切換到webfiles。經過觸發from方法就能夠有選擇性地將須要的目錄添加到WAR文件中,以下:

webAppDirName = "webfiles'        //改變web應用的源代碼目錄
war {
    from 'static'                 //將靜態資源文件的目錄(js目錄,css目錄等)添加到WAR文件的根目錄 
}

以前的例子僅僅顯示了War插件配置選項的一部分。若是你要找某個配置參數,那麼查看War插件的DSL指南是第一選擇。

在嵌入式web容器中運行

如今咱們來將文件部署到Servlet容器(Jetty)中。由於War插件暴露了全部的信息,Jetty插件能夠在運行時訪問它們。這是Gradle中一個典型的例子,經過Gradle的API,一個插件能夠訪問另外一個插件的配置。在你的構建腳本中,像這樣使用插件:

apply plugin: 'jetty'

運行web應用使用的任務是 jettyRun 。即便沒有WAR文件,它也會啓動Jetty容器:

$ gradle jettyRun

在輸出結果的最後一行,插件告訴你Jetty所監聽的請求URL。Gradle會一直讓應用程序運行,直接你按「Ctrl + C」鍵。Jetty是如何知道在什麼端口和上下文中運行應用的呢?仍是約定。Jetty插件運行一個web應用的默認端口8080 。上下文路徑 abc 是從項目名字繼承的。固然,這些都是可配置的

:每次改變項目代碼都須要從新啓動容器是很是麻煩和耗時的。Jetty插件容許你在不重啓容器的狀況下,改變靜態資源和JSP文件。另外,還針對class文件的改變配置像Jrebel這樣的字節碼交換技術來執行熱部署

定製Jetty插件

假設你不滿意Jetty插件提供的默認值。好比,已經有一個應用使用了8080端口,並且你也討厭輸入那麼長的上下文路徑。下面的配置能夠解決你的問題 :

jettyRun {
    httpPort = 9090
    contextPath = 'a'
}

用這個配置啓動應用,將暴露:http://localhost:9090/a 。Jetty插件還提供了更多的配置選項,查看插件的API文檔是最好的選擇。

相關文章
相關標籤/搜索