[英]Unable to read file from src/main/resources after gradle distTar in Kotlin
我在src/main/resources
文件夹中有一个名为user.json
的文件。
在我 package 我的应用程序进入 jar 文件后 gradle 执行命令
gradle distTar
我无法打开文件并得到这样的异常
Caused by: java.io.FileNotFoundException: file:/app/api-latest/lib/api-latest.jar!/user.json (No such file or directory)
我尝试以 3 种方式访问文件,现在都导致了 FileNotFoundException:
1:
fun readFileFromResources(filename : String) : File {
return File(filename)
}
2:
fun readFileFromResources(filename : String) : File {
val classLoader = Util::class.java.classLoader
return File(classLoader.getResource(filename).file)
}
3:
fun readFileFromResources(filename : String) : File {
return File("src/main/resources", filename)
}
我解压了生成的.jar,看到user.json文件确实在package的根目录下。
有人知道这不起作用的原因吗? 我正在使用 gradle 4.5.1 和 Kotlin 1.2.30
我的 build.gradle 看起来像这样
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()
如果您需要磁盘上的文件,则可以制作一个临时文件,将文件复制到此处并在使用后将其删除。
我花了 2-3 天的时间来完成这项工作,为了让相同的 url 同时适用于 Jar 或在本地,url(或路径)需要是存储库根目录的相对路径。
..意思是,您的文件或文件夹在您的src
文件夹中的位置。
could be "/main/resources/your-folder/" or "/client/notes/somefile.md"
不管它是什么,为了让您的 JAR 文件找到它,url 必须是存储库根目录的相对路径。
it must be "src/main/resources/your-folder/" or "src/client/notes/somefile.md"
现在你得到了练习,对于 Intellij Idea 用户来说幸运的是,你可以通过a right-click on the folder or file -> copy Path/Reference.. -> Path From Repository Root (this is it)
来获得正确的路径
最后,粘贴它并做你的事情。
url(或路径)需要是存储库根目录的相对路径。
..意思是,您的文件或文件夹在您的src
文件夹中的位置。
could be "/main/resources/your-folder/" or "/client/notes/somefile.md"
不管它是什么,为了让您的 JAR 文件找到它,url 必须是存储库根目录的相对路径。
it must be "src/main/resources/your-folder/" or "src/client/notes/somefile.md"
现在你得到了练习,对于 Intellij Idea 用户来说幸运的是,你可以通过right-click on the folder or file -> copy Path/Reference.. -> Path From Repository Root
的路径(就是这样)来获得正确的路径
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.