在构建 Java 9 模块的 Gradle 项目中,资源文件位于何处?Gradle & Java 9 Module Support问题溶液
从IDEA 2018.2.1开始,IDE开始从已模块化的依赖项中突出显示“不在模块图中”的错误包。我向项目添加了一个文件并添加了必需的语句,但现在访问目录中的资源文件时遇到问题。module-info.java
requires
src/main/resources
(有关完整示例,请参阅此 GitHub 项目。
当我使用或 +生成的包装脚本时,我能够读取资源文件,但是当我从IDE运行我的应用程序时,我没有。./gradlew run
./gradlew installDist
我向 JetBrains 提交了一个问题,我了解到 IDEA 使用的是模块路径,而 Gradle 默认使用类路径。通过将以下块添加到我的,我能够让Gradle也...无法读取任何资源文件。build.gradle
run {
inputs.property("moduleName", moduleName)
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--module', "$moduleName/$mainClassName"
]
classpath = files()
}
}
我尝试将我感兴趣的资源目录作为“包”,并在编译时遇到了构建失败:export
错误:包为空或不存在:mydir
使用而不是得到相同的错误,尽管降级为警告。opens
exports
我甚至尝试将资源目录移动到 下,但这会产生相同的错误/警告,并且还导致资源未复制到该目录。mydir
src/main/java
build
在Java 9中,资源应该去哪里,我如何访问它们?
注意:在继续研究这个问题之后,我已经对这个问题进行了大量编辑。在最初的问题中,我也试图弄清楚如何列出资源目录中的文件,但在调查过程中,我确定这是一个红鲱鱼 - 首先,因为读取资源目录仅在从URL读取资源时才有效(甚至可能不起作用),其次是因为普通文件也不起作用, 所以很明显,问题出在一般的资源文件上,而不是专门与目录有关的问题。file:///
溶液:
根据Slaw的答案,我添加了以下内容:build.gradle
// at compile time, put resources in same directories as classes
sourceSets {
main.output.resourcesDir = main.java.outputDir
}
// at compile time, include resources in module
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--patch-module', "$moduleName="
+ files(sourceSets.main.resources.srcDirs).asPath,
'--module-version', "$moduleVersion"
]
classpath = files()
}
}
// at run time, make Gradle use the module path
run {
inputs.property("moduleName", moduleName)
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--module', "$moduleName/$mainClassName"
]
classpath = files()
}
}
附注:有趣的是,如果我不继续添加 Slaw 的代码来使任务针对 JAR 执行,则尝试读取运行任务中的资源目录现在会抛出 IOException
,而不是提供文件列表。(针对 JAR,它只是得到一个空的 。)run
InputStream
InputStream