Jetty入門(1-4)
使用Gradle來進行Java Web應用開發項目管理,可以十分便利地解決包依賴等問題。
war插件的出現,讓項目部署成為一個復制粘貼的過程,那有沒有辦法讓Java web應用的部署,就像windows下安裝軟件,雙擊一下就可以呢?又或者Java web應用開發過程中,有沒有辦法自動檢測項目變化,自動編譯與加載呢?
gretty支持熱部署、HTTPS、轉發、調試、自動化運行環境等諸多特性,讓開發和部署變得更加簡單。
本文將介紹gretty插件的最常用的幾種特性和使用方法,適合對使用過Java web和Gradle的童鞋。
1.安裝gretty
1 2 3 4 5 6 7 8 9 10 11 12 |
// JDK6+,Gradle 1.10+
// build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath ‘org.akhikhl.gretty:gretty:+‘
}
}
apply plugin: ‘org.akhikhl.gretty‘
|
或
1 |
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 容器
1 2 3 4 5 6 7 8 |
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 添加新的資源目錄
1 2 3 4 5 6 7 |
// 除了src/main/webapp外,可另外指定資源目錄
gretty{
// ...
extraResourceBase ‘dir1‘ ,
extraResourceBases ‘dir2‘ , ‘dir3‘
// ...
}
|
3.5 HTTPS 支持
-
生成自簽名證書,僅在開發時使用
1 2 3 4 5 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連接 -
手動配置
1 2 3 4 5 6 7 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中加入以下內容
1 2 3 4 5 6 7 8 9 10 <
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,設置轉發規則
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // 根地址轉發到 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)
1 2 3 4 5 |
// 為所有的debug命令配置參數
gretty {
debugPort = 5005 // 默認
debugSuspend = true // 默認
}
|
1 2 3 4 5 6 7 8 9 |
// 僅針對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,例如
1 2 3 4 5 product {
webapp project
// include this project
webapp
‘:ProjectA‘
webapp
‘:ProjectB‘
}
4.2 gradle archiveProduct
- 打包生成的安裝文件
- 生成目錄位於 build/output/${project.name}
本文同步發布在 Github,後期將不斷更新,歡迎關註。
Jetty入門(1-4)