小小刀博客: https://www.lixiang.red
小小刀公眾號: 程式設計師心情站
原創不易,轉載請註明出處
#項目背景
讀過小刀以前文章的小夥伴應該還記得,小刀和大家分享過,如何用thymeleaf生成mybatis的模板:
https://www.lixiang.red/articles/2019/07/23/1563857782748.html
也和大家分享過,如何去設計小刀目前負責的商品模塊:
https://www.lixiang.red/articles/2019/07/25/1564025186602.html
現在工具類有了,設計也有了,下面就要開始搭建項目了,今天小刀就和大家分享一下如何用gradle創建一個多模塊的應用
spring-boot: java做web開發,這個差不多是基礎了
mybatis: 做javaweb開發,連資料庫大都是用的這個
redis: 做javaweb開發,緩存大都是用的這個
用的都是常用的東西,沒什麼新特色,大家對技術選型這塊,可以不考慮這麼多,隨大流就行了,想高級一點,就深入把每一部分的原理弄清楚.
為什麼選gradle沒有用maven呢 ,gradle做為新一代的構建工具,說實話,構建速度,我還真沒對比過,但就方便省事而言,gradle還是挺省事的,寫的代碼變少了,也清晰了不少,而且迭代升級超快,去年第一次接觸gradle的時候還是4.x的版本,現在都5.x了
gradle 配置多模塊項目想要學習gradle多模塊最好的方式,就是看看spring源碼, spring 源碼就是用的gradle進行構建,小刀fork了官網的spring項目,並且新加子一個中文注釋的分支
https://github.com/weixiaodexiaoxiaodao/spring-framework 分支是:5_1_x_study
所以需要複雜構建的小夥伴可以看看spring中是怎麼寫的,但是現在簡單的構建 可以直按小刀下面的寫法, 我們一起來創建一個基本的項目,以後的項目都上課就那樣以這個為藍本進行構建
初始項目的生成,我們還是選用spring官方的生成方式:
https://start.spring.io/
在這個頁面,我們可以選擇一些通用的配置, 如, maven , gradle ,jdk版本,依賴等等,這裡小刀填一個最小化的版本:
然後選生成工程,打開後,可得到一個開箱即用的工程
但是這個工程是單模塊的,我們要把他改造成多模塊的
改造成多模塊項目改造並不麻煩, 像以前在maven工程中, 需要在主pom裡面聲明Module一樣, gradle需要在settings.gradle裡面添加名處模塊的名稱:
rootProject.name = 'market'include 'market-admin'include 'market-client'include 'market-service'include 'market-common'include 'market-business'include 'market-business-impl'然後在對應著新建文件夾,然後把我們初始化生成項目中的文件,複製到market-admin 這個文件夾中.現在的項目結構如下圖所示:
配置全局配置項以前在用maven時, 我們需要一個額外的setting.xml來配置maven使用的鏡像之類的,在gradle中,就不需要額外的文件了,只需要在build.gradle裡面配置即可.所以現在我們在主build.gradle中進行配置整個項目的maven倉庫的地址
配置maven倉庫的地址allprojects { repositories { maven { url getMavenPublicUrl() credentials { username 'xxxx' password 'xxxx' } } maven { url getMavenSnapshotUrl() credentials { username 'xxxx' password 'xxxx' } }
}}
def getMavenPublicUrl(){ def url = "http://xxxxx.xxxxx:port/repository/maven-public/"; if(project.hasProperty('BUILD_TYPE')){ if(BUILD_TYPE == "test"){ println "現在是測試環境" url = "http://xxxxx.xxxxx:8081/repository/maven-public/" } } return url}
def getMavenSnapshotUrl(){ def url = "http://xxxxx.xxxxxxx:port/repository/maven-snapshots/"; if(project.hasProperty('BUILD_TYPE')){ if(BUILD_TYPE == "test"){ println "現在是測試環境" url = "http://xxxxxx:8081/repository/maven-snapshots/" } } return url}這裡面我們可以通過腳本來判斷當前執行構建的是什麼環境,不同的環境有不同的maven地址, 啟動構建時需要傳參:
gradle bootjar -PBUILD_TYPE=test --refresh-dependencies -info -b ${app_name}/build.gradle配置gradle插件的地址在settings裡面頂頭開始寫,小刀這裡是用的阿里雲公開的gradle插件地址,如果是用自己nexus服務的話,需要先在nexus上新建一個代理repo,然後代理gradle 插件地址, settings.build中再對應的地址改為nexus中新建的repo的地址
pluginManagement { repositories { maven { url "https://maven.aliyun.com/repository/gradle-plugin" } }}模塊及功能劃分如上面目錄結構圖所示,一般來說,這幾層都是避不可免的,對外提供web訪問的admin模塊,打包出去的client模塊, 對外提供dubbo接口的service模塊,供admin,service調用的business接口模塊,business的實現邏輯的business-impl模塊,自己項目定製化的工具類,通用的配置等等.
這裡一直有個小糾結,就是現在很多項目其實寫了接口,也只是一個實現類,並沒有說很多實現類怎麼樣, business和business-impl 實際上是一對一的關係,這裡面會有不少小夥伴選擇新建項目時,去除掉 business和 bubsiness-impl , 用一層manager來頂替接口和實現類,admin調用manager , manager調用dao. 具體怎麼選擇,可根據公司業務來選擇.
注意依賴和配置的位置雖說現在這樣項目已經可以跑起來了,但實際上,還是有不少坑,如主build.gradle裡面不要引依賴,但是可以寫版本號.
只能在admin,service的build.gradle裡面寫springboot的插件
配置文件,只能放在admin和service的resources目錄下
類如mybatis的連接, redis的連接配置, apollo,mq 等配置,都只能放在admin/service的相關位置
最後說兩句做到上面這些, 一個簡單的gradle多模塊化項目就搭建完成, 如果需要研究下複雜的怎麼配置,可以參考spring 源碼中的build.gradle的寫法:
https://github.com/weixiaodexiaoxiaodao/spring-framework/blob/master/build.gradle
大家在配置過程中有什麼問題歡迎隨時給小刀留言或加小刀微信一起討論:best396975802