使用通用模块时无法获取资源

时间:2018-05-16 15:09:32

标签: gradle kotlin

我正在开发一个完整的堆栈应用程序,它有三个模块:后端,前端是普通的。他们的名字是不言自明的。使用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-jvmkotlin-platform-js应用于每个模块。

还尝试将资源复制到公共模块,但不起作用。清理项目并使IntelliJ缓存无效。

在IntelliJ中调试或运行应用程序时会发生这种情况,当编译成它运行的胖jar时。

我可能知道为什么会抛出错误。有时后端模块中有一个out文件夹,其内容是已编译的类和资源文件夹。当文件夹存在时,应用程序可以运行,如果不存在,则会抛出上面的异常。

我不知道我是否遗漏了某些东西。

0 个答案:

没有答案