1. 程式人生 > >Jetty入門(1-4)

Jetty入門(1-4)

html 配置文件 關註 hive 簽名證書 自動加載 spa 查詢參數 應用

使用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)