概述
gradle是啥東西,有什么好處這里就不說了,反正我是把我所有之前的項目大部分都重構成gradle構建了,新建項目也基本都是gradle,一個字: 用起來真爽!
前前后后也是查了很多資料,這里總結一下:
准備工作:
1 需要懂點grovy語法,我之前特意學習了一個月groovy,這里可以放一下我的學習筆記與資料,groovy很簡單,會java很容易就會了: https://gitee.com/houzheng1216/groovy
2 idea與gradle安裝和環境變量配置,盡量用高版本,我用的是5.4的版本
所有涉及代碼筆記地址: https://gitee.com/houzheng1216/tool_maniac/tree/master/
gradle概念project和task介紹
Gradle中的所有內容都基於兩個基本概念:
prject
項目(Project)和任務(Task)。每個Gradle構建都是由一個或多個project組成。每個project都是有一個或者多個任務組成。
任務之間具有依賴關系,保證了任務的執行順序。任務代表構建執行的一些原子工作。
這可能是編譯某些類,創建JAR,生成Javadoc或將一些jar或者aar文件發布到maven倉庫。
task
每一個操作都可以定義為一個task任務
自定義task
//方式一
tasks.create('t2') {
doFirst {
println("任務執行之前的操作")
}
doLast {
println("任務執行之后的操作")
}
println "Hello Gradle2!"
}
//方式二
// t1 依賴t2,t2先執行戶t1再執行,被依賴的t2要定義在t1前面
task t1(dependsOn:t2) {
description '這里可以添加任務說明'
println 'Hello Gradle1!'
}
//方式三
//有兩個參數,第一個是任務的名稱,第二個是個lambda表達式,是任務的具體邏輯
task("t5",{
println("自定義task")
}).dependsOn("t1") //依賴
//方式四
task('t3') {
description '這里可以添加任務說明'
ext{ // ext 用於自定義動態屬性
hou= "houzheng"
}
def uUID = UUID.randomUUID()
println "uuid:"+uUID
println "name:${hou}" // 引用動態屬性
}
定義好之后對應的gradle界面就會有相應操作,可直接執行
一 構建普通項目
新建普通項目
使用本地gradle
配置build.gradle
打包
生成jar地址
運行測試
二 構建web項目
新建
配置build.gradle
//聲明gradle腳本自身需要使用的資源,優先執行
buildscript {
repositories {
mavenLocal() // 本地maven倉庫
maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter() //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java
}
}
plugins {
id 'java'
id 'war' // web插件,指定為web項目
}
group 'com.hou'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
//倉庫管理
repositories {
mavenLocal() // 本地maven倉庫
//自定義maven\倉庫地址
maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter() //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java
}
/**
* api 用於取代compile(已被廢棄)
* api或compile關鍵字引用的包對於其他module來說是可見的,
* implementation關鍵字引用的包對於其他module來說是不可見的。
*/
//項目依賴
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
創建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>
添加tomcat
整合springmvc
添加springmvc依賴
//項目依賴
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
//spring 系列包 5.1.6
// spring mvc
implementation group: 'org.springframework', name: 'spring-webmvc', version: '5.1.6.RELEASE'
// spring 核心包
implementation group: 'org.springframework', name: 'spring-core', version: '5.1.6.RELEASE'
// spring beans
implementation group: 'org.springframework', name: 'spring-beans', version: '5.1.6.RELEASE'
// spring 上下文
implementation group: 'org.springframework', name: 'spring-context', version: '5.1.6.RELEASE'
// spring web
implementation group: 'org.springframework', name: 'spring-web', version: '5.1.6.RELEASE'
// spring orm
implementation group: 'org.springframework', name: 'spring-orm', version: '5.1.6.RELEASE'
// spring測試包
implementation group: 'org.springframework', name: 'spring-test', version: '5.1.6.RELEASE'
}
新建配置文件
修改web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 防止中文參數亂碼 放在前面 -->
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
<!-- 強制進行轉碼 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- spring 配置Listener-->
<!-- needed for ContextLoaderListener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext.xml</param-value>
</context-param>
<!-- 添加ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置springmvc前端控制器 DispatcherServlet-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--Sources標注的文件夾下需要新建一個spring文件夾-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<!-- 配置所有路徑都走springmvc DispatcherServlet -->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern><!--映射根路徑-->
</servlet-mapping>
</web-app>
測試
三 構建springboot項目
新建步驟都一樣,build.gradle配置有點變化
//聲明gradle腳本自身需要使用的資源,優先執行
buildscript {
ext { // ext 定義動態屬性
springBootVersion = '2.1.4.RELEASE'
}
repositories {
mavenLocal() // 本地maven倉庫
maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter() //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}" // 使用動態屬性
classpath 'org.hidetake:gradle-ssh-plugin:2.6.0' // ssh依賴
}
}
plugins {
id 'java'
id 'war'
}
apply plugin: 'org.springframework.boot' //使用springboot插件
apply plugin: 'io.spring.dependency-management' //版本管理插件
sourceCompatibility = '11'
targetCompatibility = '11'
//配置依賴倉庫
repositories {
mavenLocal() // 本地maven倉庫
maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' } //自定義
jcenter() //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java
}
//項目依賴
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
// 使用exclude手動排除依賴,不需要指定版本號
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
// gradle5原生支持junit,添加下面即可
test {
useJUnitPlatform()
}
四 構建多模塊項目
新建父項目與子項目結構
配置父項目setting.gradle
// 父項目名稱
rootProject.name = 'blog-system'
// 導入子模塊
include 'blog-web'
include 'blog-service'
include 'blog-pojo'
include 'blog-dao'
include 'blog-admin'
配置父項目build.gradle
//聲明gradle腳本自身需要使用的資源,優先執行
buildscript {
ext {
springBootVersion = '2.1.4.RELEASE'
}
repositories {
mavenLocal() // 本地maven倉庫
maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter() //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
}
}
//allprojects所有項目共享的配置
allprojects {
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'java-library'
group = 'com.hou'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 11
targetCompatibility = 11
}
// subprojects : 所有子模塊共享的配置
subprojects {
apply plugin: 'org.springframework.boot' //使用springboot插件
apply plugin: 'io.spring.dependency-management' //版本管理插件
// java編譯的時候缺省狀態下會因為中文字符而失敗
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
// 配置所有子模塊的依賴倉庫地址
repositories {
// 本地maven倉庫
mavenLocal()
maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' }
//和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java
jcenter()
}
//所有子模塊共有依賴
dependencies{
// gradle5.0版本以上引入需要這種形式
compileOnly 'org.projectlombok:lombok:1.18.8'
annotationProcessor 'org.projectlombok:lombok:1.18.8'
implementation 'org.codehaus.groovy:groovy'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
}
配置子項目依賴關系,比如dao依賴model.service依賴dao,web依賴service
dependencies {
//需要使用api,即web等模塊引入從模塊后,dao對web等模塊是可見的,即間接依賴
api (project(':blog-dao'))
implementation 'org.springframework.boot:spring-boot-starter'
}
五 ssh部署
腳本添加ssh插件
添加ssh插件
//關閉tomcat
task shutdownTomcat() {
doLast {
ssh.run {
session(remotes.deployServer) {
println 'shut down tomcat...'
//編寫腳本
execute "/usr/local/app/apache-tomcat-9.0.24/bin/shutdown.sh"
// 執行腳本
// executeScript '''#!/bin/sh
// rm -rf /opt/app/apache-tomcat-7.0.67/webapps/cloud_server
// rm -f /opt/app/apache-tomcat-7.0.67/webapps/cloud_server.war
// '''
}
}
}
}
////刪除項目
task del(dependsOn:shutdownTomcat) {
doLast {
ssh.run {
session(remotes.deployServer) {
println 'start deleting...'
execute "rm -rf /usr/local/app/apache-tomcat-9.0.24/webapps/slf4*"
}
}
}
}
//部署到服務器
task depoly(dependsOn: del) {
doLast {
ssh.run {
session(remotes.deployServer) {
println 'start copying war...'
put from: buildDir.toString() + '/libs/slf4j.war', into: '/usr/local/app/apache-tomcat-9.0.24/webapps'
execute "/usr/local/app/apache-tomcat-9.0.24/bin/startup.sh"
}
}
}
}
編寫部署task
//關閉tomcat
task shutdownTomcat() {
doLast {
ssh.run {
session(remotes.deployServer) {
println 'shut down tomcat...'
//編寫腳本
execute "/usr/local/app/apache-tomcat-9.0.24/bin/shutdown.sh"
// 執行腳本
// executeScript '''#!/bin/sh
// rm -rf /opt/app/apache-tomcat-7.0.67/webapps/cloud_server
// rm -f /opt/app/apache-tomcat-7.0.67/webapps/cloud_server.war
// '''
}
}
}
}
////刪除項目
task del(dependsOn:shutdownTomcat) {
doLast {
ssh.run {
session(remotes.deployServer) {
println 'start deleting...'
execute "rm -rf /usr/local/app/apache-tomcat-9.0.24/webapps/slf4*"
}
}
}
}
//部署到服務器
task depoly(dependsOn: del) {
doLast {
ssh.run {
session(remotes.deployServer) {
println 'start copying war...'
put from: buildDir.toString() + '/libs/slf4j.war', into: '/usr/local/app/apache-tomcat-9.0.24/webapps'
execute "/usr/local/app/apache-tomcat-9.0.24/bin/startup.sh"
}
}
}
}
注意: 如果報錯 status 1 ,則看日志提示,需要配置JAVA_HOME環境變量,看下面注意點
六 使用注意點
1 多模塊項目中如果有多個jar項目,需要指定一個mainClass:
2 使用ssh部署的時候需要配置環境變量
通過SSH直接執行遠程命令和腳本
這種方式會使用Bash的non-interactive + non-login shell模式,它會創建一個shell,執行完腳本之后便退出,不再需要與用戶交互。
no-login shell,顧名思義就是不是在登錄Linux系統時啟動的(比如你在命令行提示符上輸入bash啟動)。它不會去執行/etc/profile文件,而會去用戶的HOME目錄檢查.bashrc並加載。
所以需要在登錄用戶的HOME目錄的.bashrc中添加需要的環境變量。