APT/KSP
基本概念
Jimmer高度依赖于JVM生态的预编译技术:
-
对于Java而言,就是APT,即Annotation Processor Tool
-
Kotlin而言,就是KSP,即Kotlin Symbol Processing
使用APT/KSP自动生成的一些代码,是使用Jimmer所必须的。
因此,如果使用Intellij打开官方例子中的任何一个Java/Kotlin项目,都会发现一些本该被自动生成代码并不存在的问题。对此,可以选择以下任何一种方法:
-
先用命令行在要打开的项目目录下执行
./mvnw install
*(仅Java例子提供)*或./gradlew build
命令完成代码生成,再用Intellij打开项目。 -
直接用Intellij打开项目,暂时无视IDE的错误,依赖下载完毕后,直接运行项目的main方法或单元测试 (save-command/save-command-kt以单元测试演示功能),所有IDE错误将会自动消失,应用也会被正确启动。
如何使用
你既可以使用Jimmer标准的构建方式,也可以采用社区提供的插件
-
用法一:使用Jimmer标准的构建方式
- Java(Maven)
- Java(Gradle)
- Kotlin(Gradle.kts)
pom.xml...省略其他代码...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.babyfish.jimmer</groupId>
<artifactId>jimmer-apt</artifactId>
<version>${jimmer.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
...省略其他代码...build.gradledependencies {
...省略其他依赖...
annotationProcessor "org.babyfish.jimmer:jimmer-apt:${jimmerVersion}"
}build.gradle.ktsplugins {
// 添加ksp插件
id("com.google.devtools.ksp") version "1.7.10-1.0.6"
...省略其他插件...
}
dependencies {
// 应用jimmer的ksp代码生成器
ksp("org.babyfish.jimmer:jimmer-ksp:${jimmerVersion}")
...省略其他依赖...
}
// 将生成的代码添加到编译路径中。
// 没有这个配置,gradle命令仍然可以正常执行,
// 但是, Intellij无法找到生成的源码。
kotlin {
sourceSets.main {
kotlin.srcDir("build/generated/ksp/main/kotlin")
}
} -
用法二:使用社区提供的出插件
https://github.com/ArgonarioD/gradle-plugin-jimmer
- Java(Gradle插件)
- Kotlin(插件)
build.gradleplugins {
// 从 Gradle 7.0 开始,可以使用 "latest.release" 代替具体的版本号,代表使用最新版本
// 也可以使用 '+' 字符代表从 '+' 字符开始匹配最新的版本号
id "tech.argonariod.gradle-plugin-jimmer" version "latest.release"
... 省略其它插件 ...
}
jimmer {
// 设定 jimmer 依赖版本,此处也可以使用 "latest.release" 或 "0.+" 等版本范围表达式
version = "${jimmerVersion}"
}build.gradle.ktsplugins {
// 从 Gradle 7.0 开始,可以使用 "latest.release" 代替具体的版本号,代表使用最新版本
id("tech.argonariod.gradle-plugin-jimmer") version "latest.release"
// 也可以使用 '+' 字符代表从 '+' 字符开始匹配最新的版本号
// 添加ksp插件
id("com.google.devtools.ksp") version "1.7.10+"
... 省略其它插件 ...
}
jimmer {
// 设定 jimmer 依赖版本,此处也可以使用 "latest.release" 或 "0.+" 等版本范围表达式
version = "${jimmerVersion}"
}
KSP官方只支持gradle,
经过实践验证,KSP的第三方Maven插件支持跟不上kotlin/KSP
本身的版本迭代,往往在升级过程中遇到很多问题。
最终Jimmer放弃了对Kotlin的Maven支持,请Kotlin开发人员使用Gradle.
对于官方例子中的所有项目而 言
-
所有Java例子都具备
pom.xml
和build.gradle
,即,maven/gradle双支持。首次打开这种项目时,Intellij会询问以何种方式打开,做出选择即可。
如果要切换打开方式,退出Intellij,删除项目下的隐藏目录
.idea
,再用Intellij打开,重新选择即可。 -
所有的Kotlin例子,只具备
build.gradle.kts
文件,即,只支持gradle。前面已经解释原因。
Intellij对通过maven引入的annotation processor的整合存在一些轻率的过度优化措施,导致gradle和IDE配合的开发体验优于maven。
在哪使用
业务项目很少是一个单项目,更多时候是借助于Maven和Gradle这类构建工具分割成多个子项目。
那么?我们应在哪些子项目中使用前面讲过的配置呢?
子项目类型 | 使用目的 | 注意事项 |
---|---|---|
定义实体的项目 | 根据实体定义生成必要的代码,例如Draft,SQL DSL, Fetcher | |
在src/main/dto 目录下定义DTO文件的项目 | 根据DTO语言的代码生成DTO类型 | 对于Java而言,除非当前子项目有实体定义,否则需要随便找个类用@EnableDtoGeneration 修饰 |
使用Spring Web注解的项目 | 自动生成Openapi文档和TypeScript代码,将Web Api的Java/Kotlin文档注释写入文档和客户端代码中;支持远程异常 |