博客逐步遷移至 極客兔兔的小站
Java Web應用開發時常使用Gradle來進行項目管理,可以十分便利地解決包依賴等問題。war插件的出現,讓項目部署成為一個復制粘貼的過程,那有沒有辦法讓Java web應用的部署,就像windows下安裝軟件,雙擊一下就可以呢?又或者Java web應用開發過程中,有沒有辦法自動檢測項目變化,自動編譯與加載呢?
gretty支持熱部署、HTTPS、轉發、調試、自動化運行環境等諸多特性,讓開發和部署變得更加簡單。本文將介紹gretty插件的最常用的幾種特性和使用方法,適合對使用過Java web和Gradle的童鞋。如有錯誤,請不吝指出,非常感謝;如本文對你有用,右下角點個推薦吧!
1.安裝gretty
// JDK6+,Gradle 1.10+
// build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.akhikhl.gretty:gretty:+'
}
}
apply plugin: 'org.akhikhl.gretty'
或
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'
2.常用命令
2.1 gradle appRun
- 編譯當前項目
- 不依賴於war任務
- 另有appRunWar、appRunDebug、appRunWarDebug
2.2 gradle appStart
- 編譯當前項目
- 使用新java線程開啟服務,監聽端口,等待HTTP請求
- 不依賴於war任務
- 不主動關閉服務,即一直在運行,需用gradle appStop關閉
- 另有appStartWar、appStartDebug、appStartWarDebug
2.3 gradle jetty* / gradle tomcat*
- 包含Start、Run、Stop等,與2.1-2.2用法一致
3.核心特性
3.1 選擇servlet 容器
gretty {
// 端口默認8080
// serlvetContainer 支持 jetty7/8/9,tomcat7/8
// contextPath 設置根路徑,默認為項目名稱
port = 8081
serlvetContainer = 'jetty9'
contextPath = '/'
}
3.2 熱部署(Gretty 1.1.5+)
常用屬性
- scanInterval:監視周期,單位為秒,設置為0等於完全關閉熱部署
- scanDir:需要監視的文件夾
- recompileOnSourceChange:監視源碼變動,自動編譯
- reloadOnClassChange:編譯的類發生改變,自動加載
- reloadOnConfigChange:WEB-INF或META-INF發生改變
- reloadOnLibChange:依賴發生改變
Gretty默認如下
- scanInterval 設置為1,每秒掃描改動1次
- scanDir默認為下 :
${projectdir}/src/main/java
${projectdir}/src/main/groovy
${projectdir}/src/main/resources
${projectdir}/build/classes/main
${projectdir}/build/resources/main
- recompileOnSourceChange、reloadOnClassChange、reloadOnConfigChange 和 reloadOnLibChange默認為true
3.3 快速加載
- fastReload屬性,默認為true,監聽
webapp/
中的內容,文件發生改變,無需重啟。
3.4 添加新的資源目錄
// 除了src/main/webapp外,可另外指定資源目錄
gretty{
// ...
extraResourceBase 'dir1',
extraResourceBases 'dir2','dir3'
// ...
}
3.5 HTTPS 支持
- 生成自簽名證書,僅在開發時使用
gretty {
httpsEnabled = true
// httpEnabled = false 禁用http
// httpsPort = 443 httpsPort默認為 8443
}
certificate → "${project.buildDir}/ssl/cert"
key-store → "${project.buildDir}/ssl/keystore"
key-store and key-manager passwords→"${project.buildDir}/ssl/properties"
key-store → 配置HTTPS連接
- 手動配置
gretty {
sslKeyStorePath = '/some/path/keystore'
sslKeyStorePassword = 'someKeystorePassword'
sslKeyManagerPassword = 'someKeyManagerPassword'
sslTrustStorePath = '/another/path/trust_keystore'
sslTrustStorePassword = 'someTrustStorePassword'
}
3.6 轉發(Gretty 1.1.7+)
- 步驟1:在WEB-INF/web.xml中加入以下內容
<filter>
<filter-name>RedirectFilter</filter-name>
<filter-class>org.akhikhl.gretty.RedirectFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RedirectFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
- 步驟2:創建WEB-INF/filter.groovy,設置轉發規則
// 根地址轉發到 index.html
filter relPath: '/', {
forward 'index.html'
}
// 舊地址轉發到新地址
filter relPath: '/old/path', {
redirect contextPath + '/new/path'
}
// 地址參數轉為查詢參數
filter relPath: ~'/path/(.*)', { matches ->
redirect new URIBuilder(requestURI).setPath(contextPath + '/anotherPath')
.setQuery(matches.relPath[0][1])
}
// 將HTTP流量全部轉發至HTTPS
filter scheme: 'http', {
redirect new URIBuilder(requestURI).setScheme('https').setPort(httpsPort)
}
3.7 調試(Debug)
// 為所有的debug命令配置參數
gretty {
debugPort = 5005 // 默認
debugSuspend = true // 默認
}
// 僅針對appRunDebug
gretty {
afterEvaluate {
appRunDebug {
debugPort = 5005
debugSuspend = true
}
}
}
4.產品生成
4.1 gradle buildProduct
- 生成安裝文件
- 生成目錄位於 build/output/${project.name}
- 結構如下
--build/output/${project.name}
|--conf/ => 配置文件
|--runner/ => servlet container 所需庫
|--starter/
|--webapps/ => java web 應用
|--restart.bat/sh
|--run.bat/sh
|--start.bat/sh
|--stop.bat/sh
- 多應用,需在build.gradle中配置 product,例如
product {
webapp project // include this project
webapp ':ProjectA'
webapp ':ProjectB'
}
4.2 gradle archiveProduct
- 打包生成的安裝文件
- 生成目錄位於 build/output/${project.name}
本文同步發布在 Github,后期將不斷更新,歡迎關注。