我正在开发一个完整的堆栈应用程序,它有三个模块:后端,前端是普通的。他们的名字是不言自明的。使用Kotlin 1.2.41
问题是当拥有公共模块时,在后端的任何类中使用getResource()
,它会返回一个异常,说明找不到该文件。没有通用模块,它可以工作。
我使用的代码:
object Configuration {
val content = javaClass.classLoader.getResource("app.properties").readText()
}
这是一个例外:
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.example.AppKt.main(App.kt:8)
Caused by: java.lang.IllegalStateException: javaClass.classLoader.ge…esource("app.properties") must not be null
at com.example.Configuration.<clinit>(Configuration.kt:4)
... 1 more
这是文件夹树:
my-app
├── backend
| ├── build.gradle
| └── src
| └── main
| ├── kotlin
| └── resources <-- app.properties here
├── common
| ├── build.gradle
| └── src
| └── main
| ├── kotlin
| └── resources
├── frontend
| ├── build.gradle
| └── src
| └── main
| ├── kotlin
| └── resources
└── build.gradle
这是后端模块的build.gradle,存储资源。
apply plugin: 'kotlin'
apply plugin: 'kotlin-platform-jvm'
apply plugin: 'com.github.johnrengelman.shadow'
buildscript {
ext {
exposed_version = '0.10.2'
h2_version = '1.4.197'
hikari_version = '3.1.0'
konfig_version = '1.6.7.0'
ktor_version = '0.9.2'
logback_version = '1.2.3'
shadow_version = '2.0.4'
}
dependencies {
classpath "com.github.jengelman.gradle.plugins:shadow:$shadow_version"
}
}
repositories {
maven { url 'https://dl.bintray.com/kotlin/ktor' }
maven { url 'https://dl.bintray.com/kotlin/exposed' }
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "io.ktor:ktor-auth:$ktor_version"
implementation "io.ktor:ktor-gson:$ktor_version"
implementation "io.ktor:ktor-html-builder:$ktor_version"
implementation "io.ktor:ktor-server-netty:$ktor_version"
implementation "com.h2database:h2:$h2_version"
implementation "com.zaxxer:HikariCP:$hikari_version"
implementation "org.jetbrains.exposed:exposed:$exposed_version"
implementation "ch.qos.logback:logback-classic:$logback_version"
implementation "com.natpryce:konfig:$konfig_version"
expectedBy project(':common')
}
configurations {
implementation {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-runtime'
}
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
compileKotlin {
kotlinOptions.jvmTarget = '1.8'
}
compileTestKotlin {
kotlinOptions.jvmTarget = '1.8'
}
kotlin {
experimental {
coroutines 'enable'
}
}
并分别将kotlin-platform-jvm
和kotlin-platform-js
应用于每个模块。
还尝试将资源复制到公共模块,但不起作用。清理项目并使IntelliJ缓存无效。
在IntelliJ中调试或运行应用程序时会发生这种情况,当编译成它运行的胖jar时。
我可能知道为什么会抛出错误。有时后端模块中有一个out
文件夹,其内容是已编译的类和资源文件夹。当文件夹存在时,应用程序可以运行,如果不存在,则会抛出上面的异常。
我不知道我是否遗漏了某些东西。