
本項目使用Gradle建構SpringBoot項目,将不同的業務進行不同的子產品劃分;
- 編輯器:Intellij IDEA- 建構工具:Gradle6.5- SpringBoot版本:2.3.2.RELEASE- 版本管理:GitHub- 個人GitHub位址: - 項目Clone位址:https://github.com/liuc8023/zhifou.git
項目結構如下
項目建構
首先建立一個項目,我們使用IDEA建構一個Gradle Java項目,作為項目的最外層,隻做為整個項目的容器,是以最外層項目隻建構為普通的Gradle項目即可;
File | New | Project
填寫GroupId與ArtifactId;
一般正式項目的GroupId為com.*開頭,也可因個人習慣自定義,具體規則大家可以參考命名規範,ArtifactId為項目名稱;
給項目設定自己本地的Gradle位址
File | Settings | Build, Execution, Deployment | Build Tools | Gradle
項目已經建立好了,我們開始建立各個子產品,在不同項目中,子產品劃分的方式也會不同,具體的子產品劃分可以按照實際項目的需求進行劃分;
下面就可以按照自己的需求建立子產品:
右鍵項目,點選 New -> Moduel,選擇Gradle,如下圖:
給新子產品設定屬性
父層項目settings.gradle設定如下:
rootProject.name = 'zhifou'include 'customer-center'
父層項目build.gradle設定如下:
下面的配置供參考,有自己需要的配置,自行百度,然後配進去
group 'com.springcloud.zhifou'version '1.0-SNAPSHOT'// buildscript 代碼塊中腳本優先執行buildscript { // ext 用于定義動态屬性 ext { springBootVersion = '2.3.2.RELEASE' } //倉庫管理 repositories { // 本地maven倉庫 mavenLocal() //自定義maven倉庫位址 maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' } mavenCentral() google() //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java jcenter() maven { url "https://repo.spring.io/snapshot" } maven { url "https://repo.spring.io/milestone" } maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } } /** * api 用于取代compile(已被廢棄) * api或compile關鍵字引用的包對于其他module來說是可見的, * implementation關鍵字引用的包對于其他module來說是不可見的。 */ //項目依賴 dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") }}//allprojects所有項目共享的配置allprojects { apply plugin: 'java' apply plugin: 'idea' apply plugin: 'maven' apply plugin: 'java-library' sourceCompatibility = 1.8 targetCompatibility = 1.8}// subprojects : 所有子子產品共享的配置subprojects { apply plugin: 'java' apply plugin: 'idea' // java編譯的時候預設狀态下會因為中文字元而失敗 [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' // 配置所有子子產品的依賴倉庫位址 repositories { // 本地maven倉庫 mavenLocal() mavenCentral() maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' } //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java jcenter() } ext {//依賴版本 lombokVersion= '1.18.12' fastjsonVersion = "1.2.54" disruptorVersion = '3.4.2' log4jVersion = '2.13.3' commonslang3Version = '3.11' commonsCodecVersion = '1.14' javaxAnnotationApiVersion = '1.3.2' jansiVersion = '1.18' huToolVersion = '5.3.10' servletApiVersion = '4.0.1' mapStructVersion = '1.3.1.Final' } //所有子子產品共有依賴 dependencies{ //這裡如果配置了jar包依賴,所有子項目共享,使用了gradle的依賴傳遞特性。 compile( //引入disruptor并發架構 "com.lmax:disruptor:$disruptorVersion", //log4j "org.apache.logging.log4j:log4j-core:$log4jVersion", "org.apache.logging.log4j:log4j-api:$log4jVersion", "log4j:log4j:1.2.17", //通用基礎庫 "org.apache.commons:commons-lang3:$commonslang3Version", "commons-codec:commons-codec:$commonsCodecVersion", "jaxen:jaxen:1.2.0", "javax.annotation:javax.annotation-api:$javaxAnnotationApiVersion", "javax.servlet:javax.servlet-api:$servletApiVersion", //lombok "org.projectlombok:lombok:$lombokVersion", //控制台彩色字型庫 "org.fusesource.jansi:jansi:$jansiVersion", "cn.hutool:hutool-all:$huToolVersion", //FastJson "com.alibaba:fastjson:$fastjsonVersion", //mapstruct "org.mapstruct:mapstruct-jdk8:$mapStructVersion", "org.mapstruct:mapstruct-processor:$mapStructVersion" ) // 測試依賴 testCompile( "org.springframework.boot:spring-boot-starter-test:$springBootVersion", "junit:junit:4.12" ) } //所有需要忽略的包定義在此 configurations { //移除spring boot 預設logger依賴 all*.exclude module: 'spring-boot-starter-logging' } //我們為 Java 項目指定了版本号以及所用的 JDK 版本,并且添加一些屬性到 mainfest 中。 jar { manifest { attributes("Implementation-Title": "Gradle") } } gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } } //Gradle 和 idea 內建時如何不自動下載下傳依賴源碼和javadoc idea { module { downloadJavadoc = false downloadSources = false } } //如果是Gradle 4.6及以上版本,則Gradle原生支援Junit5 test { useJUnitPlatform() testLogging { showStandardStreams = true exceptionFormat = "full" } }}
子工程build.gradle設定如下:
// buildscript 代碼塊中腳本優先執行buildscript { // ext 用于定義動态屬性 ext { springBootVersion = '2.3.2.RELEASE' springloadedVersion = '1.2.8.RELEASE' } //倉庫管理 repositories { // 本地maven倉庫 mavenLocal() //自定義maven倉庫位址 maven { url = 'http://maven.aliyun.com/nexus/content/groups/public/' } mavenCentral() google() //和maven中央倉庫一樣的另一個依賴管理倉庫,主要是java jcenter() maven { url "https://repo.spring.io/snapshot" } maven { url "https://repo.spring.io/milestone" } maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } } /** * api 用于取代compile(已被廢棄) * api或compile關鍵字引用的包對于其他module來說是可見的, * implementation關鍵字引用的包對于其他module來說是不可見的。 */ //項目依賴 dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") //配置熱部署 classpath ("org.springframework:springloaded:${springloadedVersion}") }}group 'com.springcloud'version '1.0'apply plugin: 'java'apply plugin: 'org.springframework.boot'apply plugin: 'io.spring.dependency-management'// 配置該項目特有的依賴dependencies { //如果要做jar包分離,此處必須要使用compile,不然系統啟動失敗,血的教訓 compile( //springboot "org.springframework.boot:spring-boot-starter-web:$springBootVersion", "org.springframework.boot:spring-boot-devtools:$springBootVersion", ) testCompile 'org.springframework.boot:spring-boot-starter-test' annotationProcessor 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok'}configurations { // 所有需要忽略的包定義在此 //移除spring boot 預設logger依賴 all*.exclude module: 'spring-boot-starter-logging'}// 清除現有的lib目錄task clearJar(type: Delete) { delete "$buildDir/libs/lib"}// 将依賴包複制到lib目錄task copyJar(type: Copy, dependsOn: 'clearJar') { from configurations.compileClasspath into "$buildDir/libs/lib"}bootJar { // 例外所有的jar excludes = ["*.jar"] // lib目錄的清除和複制任務 dependsOn clearJar dependsOn copyJar // 指定依賴包的路徑 manifest { attributes "Manifest-Version": 1.0, 'Class-Path': configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ') }}
其中clearJar、copyJar及bootJar作用是将子工程(customer-center)單獨打一個可運作的jar包,其依賴的jar包放到customer-center工程下的bulid | libs | lib下,如下圖:
然後在項目中新增啟動類及測試方法,如下:
package com.springcloud.zhifou.customer;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;/** * @author liuc */@RestControll[email protected] class CustomerCenterApplication { public static void main(String[] args) { SpringApplication.run(CustomerCenterApplication.class, args); } @RequestMapping(value="/hello",method= RequestMethod.GET) public String hello(){ return "Hello World"; }}
至此,可以使用gradle中的build工具編譯打包了,然後進行測試
下面是build運作的結果:
0:24:09: Executing task 'build'...> Task :customer-center:compileJava UP-TO-DATE> Task :customer-center:processResources NO-SOURCE> Task :customer-center:classes UP-TO-DATE> Task :customer-center:clearJar> Task :customer-center:copyJar> Task :customer-center:bootJar UP-TO-DATE> Task :customer-center:jar SKIPPED> Task :customer-center:assemble UP-TO-DATE> Task :customer-center:compileTestJava NO-SOURCE> Task :customer-center:processTestResources NO-SOURCE> Task :customer-center:testClasses UP-TO-DATE> Task :customer-center:test NO-SOURCE> Task :customer-center:check UP-TO-DATE> Task :customer-center:build UP-TO-DATEDeprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.Use '--warning-mode all' to show the individual deprecation warnings.See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warningsBUILD SUCCESSFUL in 2s4 actionable tasks: 2 executed, 2 up-to-date0:24:11: Task execution finished 'build'.
最後啟動項目
通過浏覽器通路測試一下,看項目是否可用
http://localhost:8080/hello
運作結果如圖
如此文對大家有微薄幫助,胖友們給個贊再走呗!