gradle構建實戰-從普通項目到springboot多模塊項目


概述

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中添加需要的環境變量。

3 一些構建的任務等,如果不想在配置階段就執行,即刷新build.gradle的時候,就必須放到 doLast或者doFirst閉包里面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM