1. 程式人生 > >gradle 構建java應用 使用筆記

gradle 構建java應用 使用筆記

gradle簡介

Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化建構工具。它使用一種基於Groovy的特定領域語言來宣告專案設定,而不是傳統的XML。既保持了Maven的優點,又通過使用Groovy定義的DSL[2],克服了 Maven中使用XML繁冗以及不靈活等缺點。
當前其支援的語言限於Java、Groovy和Scala,計劃未來將支援更多的語言。

eclipse 中gradle外掛的使用

安裝gradle外掛

由於公司歷史的原因,開發工具一直用Eclipse進行,故以下介紹基於Eclipse

help>Eclipse marketplace
在find處輸入 gradle 點選右邊的go 按鈕
查詢結果中找到Gradle(sts) intergration fro Eclipse ****.RELEASE 點選install 或者直接拖到Eclipse中安裝

使用

建立gradle專案, new > other > gradle(sts) project

目錄結構
 src/main/java         --開發原始碼包
 src/main/resoureces   --開發資源包
 src/test/java         --測試原始碼包
 src/test/resources    --測試資源包
 build                 --build存放目錄包
 src                   --build原始碼包
 build.gradle          --gradle任務配置檔案

可以用svn檢出平臺sin專案 
http://103.10.84.37/svn/SIN/trunk 作為參考專案此專案為多專案
檢出之後先從Eclispe中刪除,讓後import 作為gradle專案, 
選擇sin專案之後,點選build model ,成功之後選擇所有子專案 finish

配置build.gradle

buildscript {
    repositories {
      jcenter()}   
    dependencies {
      classpath 'org.akhikhl.gretty:gretty:+'}}

buildscript {
  repositories {
    jcenter()}
  dependencies {
    classpath 'org.hidetake:gradle-ssh-plugin:2.0.0'}}/****引入gradle外掛*****************/
apply plugin:'java'
apply plugin:'eclipse'/****jdk版本*****************/ sourceCompatibility =1.7/****maven倉庫*****************/ repositories { maven { url "http://103.10.84.37:8081/nexus/content/groups/public/"} maven { url "http://repository.ow2.org/nexus/content/repositories/public/"}}/****編譯編碼,解決Gradle編譯時出現: 編碼GBK的不可對映字元*****************/[compileJava, compileTestJava]*.options*.encoding ='UTF-8'/****依賴關係*****************/ dependencies { compile "et.sin:sin-cache:1.0.8","et.sin:sin-resteasy:1.0.8" runtime "et.sin:sin-codeseed:1.0.8" testCompile "junit:junit:4.9","org.springframework:spring-test:4.2.4.RELEASE"}/****生成jar*****************/ version ='1.0'//釋出版本 jar { manifest { attributes 'Created-By':'eteng-etd',//宣告該檔案的生成者'Implementation-Title':'Singularity','Implementation-Version': version }//jar包包含測試程式碼,用於其它專案測試呼叫from(sourceSets.test.allJava)}/****生成原始碼jar*****************/ task sourceJar(type:Jar){from sourceSets.main.allJava//主體原始碼from sourceSets.test.allJava//測試原始碼 classifier "sources"}/***生成javadoc,命令列引數配置**/ javadoc { source =[sourceSets.main.allJava,sourceSets.test.allJava]//需要生成javadoc的原始碼包 classpath=configurations.testCompile options.encoding ="UTF-8" options.charSet ="UTF-8" options.links =["http://docs.oracle.com/javase/8/docs/api/"] options.memberLevel="PACKAGE"}//生成javadoc jar task javadocJar(type:Jar, dependsOn: javadoc){from javadoc.destinationDir classifier ='javadoc'} task codeseed(type:JavaExec, dependsOn:'classes'){ description '執行程式碼生成器' classpath = sourceSets.main.runtimeClasspath main ="et.common.codeseed.CodeSeed"}/****引入gretty外掛*****************/ apply plugin:'org.akhikhl.gretty' gretty { port =8080 servletContainer ='tomcat8'//contextPath ="/sin" extraResourceBase project.getProjectDir().getAbsolutePath()+"/webapp" contextConfigFile = project.getProjectDir().getAbsolutePath()+"/webapp/WEB-INF/ROOT.xml" enableNaming=true//啟用JNDI}

此平臺推薦配置 ,請參考平臺demo專案中的build.gradle
初級入門可使用以上配置執行一個web專案了, 請往下看

build.gradle詳解

看完builld.gradle配置 ,我們知道, 其實 這個檔案就是配置引入那些 gradle 的外掛,自定義任務和第三方jar包依賴關係

/**引入java外掛***/

apply plugin: 'java'

引入外掛之後 ,相當於 引入了一定任務,執行之後幫我們做一定的操作
例如引入java之後, 在gradle task 檢視中我們選擇 project 為自己的專案
就可看到相關任務

還可以設定一些必要的配置資訊
/*jdk版本**/
sourceCompatibility = 1.7
/***maven倉庫下載依賴jar用/
repositories {
}

還有配置關鍵的jar包依賴
/**依賴關係***/
dependencies {
compile "et.sin:sin-cache:1.0.8",
"et.sin:sin-resteasy:1.0.8"
runtime "et.sin:sin-codeseed:1.0.8"
testCompile "junit:junit:4.9",
"org.springframework:spring-test:4.2.4.RELEASE"
}

compile 代表編譯時依賴
runtime 代表執行時依賴
testCompile junit 測試時的依賴

更詳細的請看http://wiki.jikexueyuan.com/project/gradle/dependency-management-basics.html 當然也可以看官網的配置

/**自定義任務****/
task codeseed(type: JavaExec, dependsOn: 'classes') {
description '執行程式碼生成器'
classpath = sourceSets.main.runtimeClasspath
main = "et.common.codeseed.CodeSeed"
}

啟動tomcat容器

我們使用了gretty外掛,配置如下

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.akhikhl.gretty:gretty:+'
}
}

/**引入gretty外掛***/
apply plugin: 'org.akhikhl.gretty'
gretty {
port = 8080
servletContainer = 'tomcat8'
//contextPath ="/sin"
extraResourceBase project.getProjectDir().getAbsolutePath() + "/webapp"
contextConfigFile = project.getProjectDir().getAbsolutePath() + "/webapp/WEB-INF/ROOT.xml"
enableNaming=true //啟用JNDI
}

引入外掛之後,看到 gradle task檢視中多了關於app的任務

appStart
appStop
appStartDebug
appRestart
等等

啟動appStart ,tomcat容器啟動

junit測試

參考平臺 test的目錄的寫法

基本到此為止......基本可以進行開發測試了
/當然你可能還不滿足於這點東西,,那就繼續吧/

build.gradle 更多高階用法

在大型java專案中,使用的gradle外掛增多和任務的增多單個配置就顯得臃腫了,
以下介紹一些其他用法:

引入其他.gradle檔案

我們可以分類寫.gradle檔案,然後在build.gradle中引入即可.
例如,我可以把關於gretty 的配置寫在 gretty.gradle

在build.gradle 中引入 
/*********ssh自動部署********************/
apply from: "ssh.gradle"
/********gretty外掛配置*****************/   
apply from: "gretty.gradle"

專案中多平臺配置檔案管理

配置其他的資原始檔, 打包時會自動加入

例如生產系統的配置和測試系統的配置時不一樣的,
正式釋出時,我們把配置指向正式系統, 配置檔案會自動覆蓋/src/main/resources,中相同的配置檔案

//設定其他資原始檔 --打包正式時啟用production
sourceSets {
    main {
        resources {
            //srcDir "config/production"
            srcDir "src/main/resources"
        }
    }
}

ssh自動部署

配置ssh.gradle  ,在build.gradle中引入 , 依賴於war任務 ,

利用ssh,先打包出項目的war包, 上傳到指定的伺服器,,然後執行命令解壓命令,讓後執行重啟tomcat的命令.
配置如下

```bash
/****引入gradle外掛*****************/
//https://gradle-ssh-plugin.github.io/
apply plugin: 'org.hidetake.ssh'

/*************打包war設定********************/
//https://dongchuan.gitbooks.io/gradle-user-guide-/content/the_war_plugin/war.html
// war  或jar包的版本
version = '1.4'
// War 或jar 包名稱
String output = new Date().format('yyyyMMddHHmm')
war.baseName = 'VSA_WEB'+output
// Web directory, this overrides the default value "src/java/webapp"
project.webAppDirName = 'webapp'
//設定其他資原始檔 --打包正式時啟用production
sourceSets {
    main {
        resources {
            //srcDir "config/production"
            srcDir "src/main/resources"
        }
    }
}
/************ssh自動部署***internal測試*****product正式******/
remotes {
    internal {
        host = '192.168.0.61'
        user = 'root'
        password = 'password'
        //identity =  identity = file("${System.properties['user.home']}/.ssh/test/id_rsa")
    }
    product {
        host = '114.215.107.01'
        user = 'root'
        //password = 'password'
        identity =  identity = file("${System.properties['user.home']}/.ssh/id_rsa")
    }
}
ssh.settings {
  knownHosts = allowAnyHosts
  //dryRun = true
}

task sshCheck << {
    ssh.run {
        session(remotes.product) {
            def result = execute 'uname -a'
            execute 'cat /etc/*-release', ignoreError: true
        }
    }
}
/***********釋出測試************/
task sshLocalDeploy(dependsOn: war) << {
    ssh.run {
        session(remotes.internal) {
            execute '/opt/bin/tomcat-sc.sh tomcat-vistv stop'
            put from: war.archivePath.path, into: '/opt/buildapp'
            println '--**war upload successed...'
            execute 'unzip -oq  /opt/buildapp/' +war.archiveName + ' -d /opt/apps/VISTV_WEB'
            println '--**war unzip successed...'
            execute '/opt/bin/tomcat-sc.sh tomcat-vistv start'
            println '--**server restart successed...'
        }
    }
}
/***********釋出測試***************/
task sshProductDeploy(dependsOn: war) << {
    ssh.run {
        session(remotes.product) {
            println '--**war starting upload ...'
            put from: war.archivePath.path, into: '/opt/back_apps'
            //execute 'unzip -oq  /opt/back_apps/' +war.archiveName + ' -d /opt/apps/VSA_WEB'
            //execute '/opt/bin/tomcat-sc.sh tomcat-test start'
        }(<a href="http://www.dztcsd.com/">資質代辦</a>)
    }
}

```

/參考資料/


作者: RobinGao 
來源:慕課網
本文原創釋出於慕課網 ,轉載請註明出處,謝謝合作!