mongodb - 是否可以通过 gradle (Kotlin-DSL) 为 Kotlin MongoDB 文档生成 Q 类?
问题描述
我有一个使用 Maven、Kotlin、QueryDSL、Spring Boot 和 MongoDB 的项目。它工作得很好,但我认为迁移到 Gradle 可以加快构建它的速度。在我开始使用 QueryDSL 移动模块之前,一切都很好。事实证明,我无法为使用 @Document 注释的 Kotlin 类生成 Q 类。那么有没有办法解决呢?文档示例(放在 /src/main/kotlin/com/company,在 kotlin 目录中):
package ...
import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.Document
@Document(collection = "myDocument")
data class MyDocument(
val smth: String
)
maven(负责生成的部分)
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<configuration>
<args>
<arg>-Werror</arg>
</args>
<annotationProcessors>
org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
</annotationProcessors>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
<sourceDir>${project.basedir}/src/main/java</sourceDir>
</sourceDirs>
</configuration>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
<sourceDir>${project.basedir}/src/main/java</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
</sourceDirs>
</configuration>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
对于 gradle+kotlin AFAIU,我们必须使用 kapt 以这种方式生成 Q-classes
kapt("com.querydsl:querydsl-apt:4.2.1:jpa")
但它对我不起作用,我的新 build.gradle.kts:
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.2.0.RELEASE"
id("io.spring.dependency-management") version "1.0.8.RELEASE"
kotlin("jvm") version "1.3.50"
kotlin("kapt") version "1.3.50"
kotlin("plugin.jpa") version "1.3.50"
id("org.jetbrains.kotlin.plugin.spring") version "1.3.21"
}
apply(plugin = "kotlin")
apply(plugin = "kotlin-kapt")
apply(plugin = "kotlin-jpa")
apply(plugin = "org.springframework.boot")
apply(plugin = "io.spring.dependency-management")
group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("com.querydsl:querydsl-jpa")
implementation("com.querydsl:querydsl-apt")
kapt("com.querydsl:querydsl-apt:4.2.1:jpa")
kapt("org.springframework.boot:spring-boot-starter-data-jpa")
kapt("org.springframework.boot:spring-boot-configuration-processor")
kapt("org.springframework.data:spring-data-mongodb:2.2.0.RELEASE")
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
}
//sourceSets { main["kotlin"].srcDirs += [generated] }
//val querydslSrcDir = "src/main/generated"
tasks.withType<Test> {
useJUnitPlatform()
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
在 Maven 中,我可以精确地设置注释处理器(org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor),但在 gradle 中我无法弄清楚如何实现它。
解决方案
您应该在部分中添加implementation("com.querydsl:querydsl-mongodb")
和。kapt("com.querydsl:querydsl-apt")
dependencies
然后在部分之后添加以下dependencies
内容。
kapt {
annotationProcessor("org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor")
}
另外,不要忘记删除那些 JPA 依赖项。
推荐阅读
- css - 带按钮的 mat-form-field 前缀和后缀位置
- python - 提取列表子集以绘制的 Pythonic 方法
- css - 如何更改 nuxt gmap 标记图标大小?
- python - Python:CalledProcessError,命令返回非零退出状态 1
- node.js - 在 NodeJS 中测试 http.Server.close 错误
- javascript - 无法使用 next.js 加载静态资产
- java - 当值出现时使调试器停止 Intelij Idea
- queue - 在达到 100 个队列项计数后,BOT 不会获取 uipath orchestrator 队列项,即使已设置分页值
- javascript - 如何有条件地显示 React JSX 中的元素?
- python - 将 Graph 转换为 SavedModel 后的 Tensorflow FailedPreconditionError