Java Gradle入門指南之gretty插件(安裝、命令與核心特性)

博客逐步遷移至 極客兔兔的小站html

    Java Web應用開發時常使用Gradle來進行項目管理,能夠十分便利地解決包依賴等問題。war插件的出現,讓項目部署成爲一個複製粘貼的過程,那有沒有辦法讓Java web應用的部署,就像windows下安裝軟件,雙擊一下就能夠呢?又或者Java web應用開發過程當中,有沒有辦法自動檢測項目變化,自動編譯與加載呢?java

    gretty支持熱部署、HTTPS、轉發、調試、自動化運行環境等諸多特性,讓開發和部署變得更加簡單。本文將介紹gretty插件的最經常使用的幾種特性和使用方法,適合對使用過Java web和Gradle的童鞋。若有錯誤,請不吝指出,很是感謝;如本文對你有用,右下角點個推薦吧!git

1.安裝gretty

// JDK6+,Gradle 1.10+
// build.gradle
buildscript {
    repositories {
         jcenter()
    }
    dependencies {
         classpath 'org.akhikhl.gretty:gretty:+'
    }
}

apply plugin: 'org.akhikhl.gretty'

github

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+)

經常使用屬性web

  • scanInterval:監視週期,單位爲秒,設置爲0等於徹底關閉熱部署
  • scanDir:須要監視的文件夾
  • recompileOnSourceChange:監視源碼變更,自動編譯
  • reloadOnClassChange:編譯的類發生改變,自動加載
  • reloadOnConfigChange:WEB-INF或META-INF發生改變
  • reloadOnLibChange:依賴發生改變

Gretty默認以下windows

  • scanInterval 設置爲1,每秒掃描改動1次
  • scanDir默認爲下 :tomcat

    ${projectdir}/src/main/java
    ${projectdir}/src/main/groovy
    ${projectdir}/src/main/resources
    ${projectdir}/build/classes/main
    ${projectdir}/build/resources/mainapp

  • recompileOnSourceChange、reloadOnClassChange、reloadOnConfigChange 和 reloadOnLibChange默認爲truewebapp

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鏈接gradle

  • 手動配置
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,後期將不斷更新,歡迎關注。

相關文章
相關標籤/搜索