Java 在Kotlin中的gradle distTar之后无法从src/main/resources读取文件

Java 在Kotlin中的gradle distTar之后无法从src/main/resources读取文件,java,gradle,kotlin,Java,Gradle,Kotlin,我在src/main/resources文件夹中有一个名为user.json的文件。 在我用gradle执行命令将应用程序打包成jar文件之后 gradle distTar 我无法打开该文件,并出现如下异常 Caused by: java.io.FileNotFoundException: file:/app/api-latest/lib/api-latest.jar!/user.json (No such file or directory) group 'example' versio

我在src/main/resources文件夹中有一个名为user.json的文件。

在我用gradle执行命令将应用程序打包成jar文件之后

gradle distTar
我无法打开该文件,并出现如下异常

Caused by: java.io.FileNotFoundException: file:/app/api-latest/lib/api-latest.jar!/user.json (No such file or directory)
group 'example'
version 'latest'

buildscript {
    ext {
        kotlin_version = '1.2.30'
        ktor_version = '0.9.0'
        logback_version =  '1.2.1'
        gson_version = '2.8.2'
        junit_version = '4.12'
        hibernate_version = '5.2.12.Final'
        hibernate_validator_version = '6.0.7.Final'
        mysql_connector_version = '6.0.4'
        h2_version = '1.4.196'
        kodein_version = '4.1.0'
        jedis_version = '2.9.0'
        mockito_version = '2.+'
        jaxb_version = '2.3.0'
    }

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'kotlin-jpa'

mainClassName = 'io.ktor.server.netty.DevelopmentEngine'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
    maven { url  "http://dl.bintray.com/kotlin/ktor" }
    maven { url "https://dl.bintray.com/kotlin/kotlinx" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "io.ktor:ktor:$ktor_version"
    compile "ch.qos.logback:logback-classic:$logback_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
    compile group: 'com.google.code.gson', name: 'gson', version: "$gson_version"
    compile group: 'org.hibernate', name: 'hibernate-core', version: "$hibernate_version"
    compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: "$hibernate_validator_version"
    compile group: 'mysql', name: 'mysql-connector-java', version: "$mysql_connector_version"
    compile group: 'org.hibernate', name: 'hibernate-c3p0', version: "$hibernate_version"
    compile group: 'com.github.salomonbrys.kodein', name: 'kodein', version: "$kodein_version"
    compile group: 'redis.clients', name: 'jedis', version: "$jedis_version"
    testCompile group: 'junit', name: 'junit', version: "$junit_version"
    testCompile group: 'io.ktor', name: 'ktor-server-test-host', version: "$ktor_version"
    testCompile group: 'com.h2database', name: 'h2', version: "$h2_version"
    testCompile "org.mockito:mockito-core:$mockito_version"
}

kotlin {
    experimental {
        coroutines "enable"
    }
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
我尝试以3种方式访问文件,现在都导致FileNotFoundException:

1:

2:

3:

我已经解包了生成的.jar,看到user.json文件确实在包的根目录中

有人知道这不起作用的原因吗? 我使用的是gradle 4.5.1和Kotlin 1.2.30

我的身材,格雷德尔看起来像这样

Caused by: java.io.FileNotFoundException: file:/app/api-latest/lib/api-latest.jar!/user.json (No such file or directory)
group 'example'
version 'latest'

buildscript {
    ext {
        kotlin_version = '1.2.30'
        ktor_version = '0.9.0'
        logback_version =  '1.2.1'
        gson_version = '2.8.2'
        junit_version = '4.12'
        hibernate_version = '5.2.12.Final'
        hibernate_validator_version = '6.0.7.Final'
        mysql_connector_version = '6.0.4'
        h2_version = '1.4.196'
        kodein_version = '4.1.0'
        jedis_version = '2.9.0'
        mockito_version = '2.+'
        jaxb_version = '2.3.0'
    }

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'kotlin-jpa'

mainClassName = 'io.ktor.server.netty.DevelopmentEngine'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
    maven { url  "http://dl.bintray.com/kotlin/ktor" }
    maven { url "https://dl.bintray.com/kotlin/kotlinx" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "io.ktor:ktor:$ktor_version"
    compile "ch.qos.logback:logback-classic:$logback_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
    compile group: 'com.google.code.gson', name: 'gson', version: "$gson_version"
    compile group: 'org.hibernate', name: 'hibernate-core', version: "$hibernate_version"
    compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: "$hibernate_validator_version"
    compile group: 'mysql', name: 'mysql-connector-java', version: "$mysql_connector_version"
    compile group: 'org.hibernate', name: 'hibernate-c3p0', version: "$hibernate_version"
    compile group: 'com.github.salomonbrys.kodein', name: 'kodein', version: "$kodein_version"
    compile group: 'redis.clients', name: 'jedis', version: "$jedis_version"
    testCompile group: 'junit', name: 'junit', version: "$junit_version"
    testCompile group: 'io.ktor', name: 'ktor-server-test-host', version: "$ktor_version"
    testCompile group: 'com.h2database', name: 'h2', version: "$h2_version"
    testCompile "org.mockito:mockito-core:$mockito_version"
}

kotlin {
    experimental {
        coroutines "enable"
    }
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
为什么这不起作用 您正试图从资源创建一个文件,必须以不同的方式进行处理

我怎样才能避开这件事 最好的方法是直接从JAR读取资源

val r = javaClass.classLoader.getResource("aa").readText()
如果您需要磁盘上的文件,您可以制作一个临时文件,将该文件复制到磁盘上,并在使用后将其删除。

为什么这样做不起作用 您正试图从资源创建一个文件,必须以不同的方式进行处理

我怎样才能避开这件事 最好的方法是直接从JAR读取资源

val r = javaClass.classLoader.getResource("aa").readText()

如果您需要磁盘上的文件,您可以制作一个临时文件,在那里复制文件,并在使用后将其删除。

为什么您需要资源作为文件?我还可以如何加载它?这取决于,您使用它的目的是什么?为什么您需要资源作为文件?我还可以如何加载它?这取决于,您使用它的目的是什么?