idea下使用gradle多项目构建生成proto协议并使用
注意事项
项目的路径不能有中文!不能有中文!不能有中文!
1.本文要达到的效果
我们的目的是在protocol子项目中写xx.proto的协议文件,然后产生java代码在shared项目中,其他项目依赖shared项目,从而让其他项目可以使用到proto协议。
2. 建立目录结构
根目录下setting.gradle配置
rootProject.name = 'multiProject'
include 'project1'
include 'project2'
include 'protocol'
include 'shared'
根目录下build.gradle
由于我需要java和kotlin混编,所以这里也有支持kotlin编译的配置,如果只是java项目,可以去掉对应导入。
buildscript {
ext {
kotlin_version = '1.3.72'
}
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
group 'com.houjr'
version '1.0-SNAPSHOT'
subprojects {
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'idea'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: kotlin_version
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.8.0'
}
}
protocol子项目的build.gradle中的配置:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10'
}
}
apply plugin: 'com.google.protobuf'
sourceSets {
main {
proto {
srcDir 'src/main/proto' //指定.proto文件路径
}
}
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.8.0'
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option "lite"
}
}
}
}
//生成目录 "$projectDir/src" "${project(':shared').projectDir}/src"
generatedFilesBaseDir = "${project(':shared').projectDir}/src"
}
由于我们把生成目录放在了其他子项目,构建后idea会警告:Duplicate content roots detected…意思是两个项目不能用同一个输出目录,具体成因百度吧,我们之后会用一种巧妙的方式绕过该警告。
3.写proto协议
4.产生java代码
执行之后,会发现shared项目下已经有产生的代码:
5. 解决之前的警告
但是此时idea并不能识别这是一个源码文件,原因是之前idea的警告:Duplicate content roots detected…。解决方法是在根目录的setting.gradle中取消包含子项目protocol。
重新构建,就可以了。
如果下次还想执行generateProto task怎么办呢?很简单,idea会记录每次执行的task。我们可以把该task存起来,这样只需第一次执行时包含protocol子项目,之后就可以不包含了,从而绕过了idea的警告。
6.使用proto协议写代码
我们在project1子项目下的build.gradle中配置依赖shared项目:
project1–build.gradle
重新构建,然后在project1中使用协议:
大功告成!
7.后记
由于gradle版本更新很快,网上很多教程都模糊不清。目前我用的gradle版本是6.7,应该是当前最新的版本了。之后有什么问题也可以给我留言讨论。欢迎分享,转载请注明出处。