应用场景:在SpringCloud微服务项目中,通常会划分成多个业务服务,而这些服务之间一般会使用Feign组件进行相互调用,所以在项目开发中会衍生出一个问题:Feign客户端代码该由服务调用方的开发人员编写还是服务提供方的开发人员编写?
服务调用方编写:开发人员A需要开发人员B提供一个接口,开发人员B写好接口后,将URL、参数、方法名等告诉开发人员A或者直接点,直接写好代码发给对方,开发人员A再拿A给的代码写进项目里 => 开发流程不够规范、后期不便维护,如果开发人员B修改了接口的URL或其他东西,那么还得通知A进行修改,效率低
服务提供方编写:开发人员A需要开发人员B提供一个接口,开发人员B将Feign客户端模块独立出来,写好Feign客户端和REST接口,再在子类中实现该接口,编写好具体业务逻辑,开发完成后,将独立出来的Feign客户端模块打包上传到私有Maven仓库,让开发人员A的项目添加B提供的Feign客户端依赖,直接即可在项目中进行接口调用,效率高,后期方便维护,开发人员B的服务接口发生了更改,让开发人员A更新依赖即可
下面说明下(踩坑过程)使用Gradle将SpringBoot项目的源码打包并上传到私有Maven仓库的方法
使用IDEA搭建SpringBoot项目(使用Gradle)时,项目根目录下的初始build.gradle文件内容大概如下
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仓库的功能
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插件的话,需要在依赖定义中指定具体版本,否则会打包失败
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文件中加上
//声明一个打包源码的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拉取官方镜像即可很方便的部署,具体操作自行百度
最后在项目根目录中执行命令(Windows系统):gradlew publish
或者在IDEA的Gradle项目构建可视化窗口 => Tasks => publishing => publish
即可自动完成源码打包并推送到私有Maven仓库