Scala如何不引用资源目录内文件直接获取其绝对路径
异常原因
你遇到的java.nio.file.InvalidPathException: Illegal char <:> at index 2是Windows平台特有的路径解析问题:Class.getResource()返回的URL路径格式为/C:/项目路径/target/classes/,前置斜杠会导致Paths.get解析时把索引2位置的冒号判定为非法字符。同时直接调用getPath()还会存在路径空格被编码为%20、特殊字符未转义的问题,进一步导致解析失败。
解决方案
以下实现不需要依赖资源目录下的任何文件,可直接获取类路径根(对应开发环境下src/main/resources的编译输出目录)的绝对路径:
import java.nio.file.Path import java.nio.file.Paths def getResourceDirAbsolutePath: Path = { // 转成URI可以自动处理路径格式、编码转义问题,从根源避免解析报错 val classpathRootUri = getClass.getClassLoader.getResource("").toURI Paths.get(classpathRootUri) }
注意事项
- 该方法仅适用于开发环境、classpath对应本地文件系统目录的场景
- 项目打包为JAR包运行时,不存在文件系统层面的实体资源目录,此时
getResource("")会返回null,你可以直接通过getClass.getResourceAsStream("/资源文件名")读取资源内容,无需获取目录路径
内容的提问来源于stack exchange,提问作者Vasanth Subramanian
相关产品推荐
相关产品推荐

