Начиная с IDEA 2018.2.1, среда IDE запускает пакеты выделения ошибок "не в графе модулей" из зависимостей, которые были модульными. Я добавил файл module-info.java
в свой проект и добавил требуемые requires
, но у меня теперь возникают проблемы с доступом к файлам ресурсов в каталоге src/main/resources
.
(Полный пример см. В этом проекте GitHub.)
Когда я использовал ./gradlew run
или ./gradlew installDist
+, полученный в результате сценарий оболочки, я смог прочитать файлы ресурсов, но когда я запускал свое приложение из IDE, я не был.
Я зарегистрировал проблему с JetBrains, и я узнал, что IDEA использует путь к модулю, а Gradle по умолчанию использует путь к классам. Добавив следующий блок в мой build.gradle
, я смог заставить Gradle также... не иметь возможности читать файлы ресурсов.
run {
inputs.property("moduleName", moduleName)
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--module', "$moduleName/$mainClassName"
]
classpath = files()
}
}
Я попытался export
-ing каталог ресурсов, который меня интересовал как "пакет", а во время компиляции получил сбой сборки:
Ошибка: пакет пуст или не существует: mydir
Использование opens
вместо exports
получило ту же ошибку, хотя и было понижено до предупреждения.
Я даже попытался переместить mydir
ресурсов mydir
в src/main/java
, но это mydir
те же ошибки/предупреждения, а также привело к тому, что ресурсы не были скопированы в каталог build
.
Где ресурсы, которые предполагается использовать в Java 9, и как мне обращаться к ним?
Примечание. Я значительно изменил этот вопрос, продолжая исследовать проблему. В начальном вопросе я также пытался выяснить, как перечислять файлы в каталоге ресурсов, но в ходе расследования я определил, что это была красная сельдь - во-первых, потому что чтение каталогов ресурсов работает только тогда, когда ресурс будучи прочитанным из file:///
URL (и, возможно, даже не тогда), а во-вторых, поскольку обычные файлы также не работали, так что проблема связана с файлами ресурсов вообще, а не с каталогами.
Решение:
Ответ на build.gradle
, я добавил следующее для 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, который заставляет задачу run
выполнить JAR, попытка чтения каталога ресурсов InputStream
в задаче запуска теперь бросает IOException
вместо предоставления списка файлов. (Против JAR он просто получает пустой InputStream
.)