作者: "@gzdaijie" 本文為作者原創,轉載請註明出處:http://www.cnblogs.com/gzdaijie/p/5267166.html Java Web應用開發時常使用Gradle來進行項目管理,可以十分便利地解決包依賴等問題。war插件的出現,讓項目部署成為一個複製粘貼的過程
作者:@gzdaijie
本文為作者原創,轉載請註明出處:http://www.cnblogs.com/gzdaijie/p/5267166.html
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/mainrecompileOnSourceChange、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,後期將不斷更新,歡迎關註。