應用場景:java
在SpringCloud微服務項目中,一般會劃分紅多個業務服務,而這些服務之間通常會使用Feign組件進行相互調用,因此在項目開發中會衍生出一個問題:Feign客戶端代碼該由服務調用方的開發人員編寫仍是服務提供方的開發人員編寫? web
服務調用方編寫:開發人員A須要開發人員B提供一個接口,開發人員B寫好接口後,將URL、參數、方法名等告訴開發人員A或者直接點,直接寫好代碼發給對方,開發人員A再拿A給的代碼寫進項目裏 => 開發流程不夠規範、後期不便維護,若是開發人員B修改了接口的URL或其餘東西,那麼還得通知A進行修改,效率低spring
服務提供方編寫:開發人員A須要開發人員B提供一個接口,開發人員B將Feign客戶端模塊獨立出來,寫好Feign客戶端和REST接口,再在子類中實現該接口,編寫好具體業務邏輯,開發完成後,將獨立出來的Feign客戶端模塊打包上傳到私有Maven倉庫,讓開發人員A的項目添加B提供的Feign客戶端依賴,直接便可在項目中進行接口調用,效率高,後期方便維護,開發人員B的服務接口發生了更改,讓開發人員A更新依賴便可api
下面說明下(踩坑過程)使用Gradle將SpringBoot項目的源碼打包並上傳到私有Maven倉庫的方法併發
使用IDEA搭建SpringBoot項目(使用Gradle)時,項目根目錄下的初始build.gradle文件內容大概以下maven
plugins { id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' } group = 'com.learn' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } ext { set('springCloudVersion', "Hoxton.SR1") } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } test { useJUnitPlatform() }
添加Gradle的maven-publish插件,該插件提供打包源碼併發布代碼到Maven倉庫的功能spring-boot
plugins { //id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' ...... id 'maven-publish' }
劃重點1: org.springframework.boot 這個插件必定要刪掉或者註釋掉,這個插件是用來將打包SpringBoot項目的,若是不由用掉這個插件,打包時將會打包成SpringBoot應用的可啓動jar包,會將各類依賴都打包進去,而不會打包成咱們想要的源碼jar包微服務
劃重點2:使用IDEA構建SpringBoot應用時,會在dependencyManagemet中統一管理依賴版本而不用咱們顯示指定,可是若是要使用Gradle的maven-publish插件的話,須要在依賴定義中指定具體版本,不然會打包失敗gradle
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web:2.2.2.RELEASE' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:2.2.1.RELEASE' testImplementation('org.springframework.boot:spring-boot-starter-test:2.2.2.RELEASE') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } }
再在build.gradle文件中加上ui
//聲明一個打包源碼的Task
task sourcesJar(type: Jar, dependsOn: classes) { from sourceSets.main.allJava archiveClassifier = 'sources' } //聲明代碼發佈 publishing { publications { vectorMaven(MavenPublication) { artifactId = 'feign-api' from components.java artifact sourcesJar } } repositories { maven { url 'http://xxxxx/repository/xxx-maven/' //私有倉庫地址 credentials { username = 'admin' //私有倉庫帳號 password = 'xxx' //私有倉庫密碼 } } } }
私有Maven倉庫是使用Nexus搭建的私有倉庫,使用Docker拉取官方鏡像便可很方便的部署,具體操做自行百度
最後在項目根目錄中使用gradlew publish命令(Windows系統)
或IDEA的Gradle項目構建可視化窗口 => Tasks => publishing => publish
便可自動完成源碼打包並推送到私有Maven倉庫