Я работаю над проектом на основе scala, используя apache flink , и до сих пор я только запускал свой проект из IntelliJ
, который работал без проблем.Теперь, когда я впервые создаю файл JAR, который затем будет выполняться во время выполнения apache flink , я столкнулся с проблемами с открытием файлов ресурсов.
При запуске файл с именемsetup.xml
изнутри src/main/resources
будет открыто.Это работает в IntelliJ
, но не во время выполнения flink.
В IntelliJ
структура папок выглядит следующим образом:
root
\
src
\
main
\
resources
\
setup.xml
При просмотре созданного файла JAR с помощью какого-либо проводника архива структура будет выглядеть следующим образом:
root
\
[...]
\
setup.xml
Варианты кода для этого я пробовал:
// by path
val filePath = getClass.getResource("/setup.xml").getPath
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)
// by URI
val filePath = getClass.getResource("/setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)
// with classloader
val filePath = getClass.getClassLoader.getResource("setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)
Все 3 варианта работают в IntelliJ
, но не во время выполнения flink.Это даст java.nio.file.FileSystemNotFoundException
или java.io.FileNotFoundException
.
Обратите внимание, что следующие будут работать в обоих IntelliJ
И во время выполнения flink:
val source = Source.fromURL(getClass.getResource("/setup.xml"))
val parsed = XML.loadString(source.getLines().mkString)
Однако , я должен иметь доступ к компонентам пути и работать с объединением / разрешением путей.Это связано с тем, что файл XML будет содержать ссылки на другие файлы, которые хранятся относительно самого файла setup.xml
.Таким образом, мне нужно получить путь к файлу setup.xml
и разрешить some-referenced.xml
с этим путем к файлу, чтобы открыть его.
Так как бы я правильно использовал один из 3 вариантов в начале, используякласс Path
, поэтому я могу динамически разрешать другие пути к файлам как в IntelliJ
, так и во время выполнения flink?