使用sbt读取src/main/scala下文件失败而IntelliJ运行正常的问题求助
问题原因
sbt 默认规则下,仅会将src/main/scala目录下的.scala等可编译源码文件纳入编译流程,不会自动复制同目录下的.txt这类静态资源文件到编译输出的classes路径。而IntelliJ IDEA的默认运行配置会将源码目录下的所有非源码文件一并同步到输出目录,所以在IDEA中运行可以正常读取,sbt运行时就会找不到文件。
解决方法
- 方案1(最推荐):将静态资源放到sbt默认资源目录
sbt 默认会自动扫描src/main/resources目录下的所有文件作为静态资源,你只需要按照对应的包路径创建目录结构,把file.txt放到src/main/resources/my/pkg/路径下,执行sbt的compile、run命令时会自动将文件拷贝到target/scala-2.11/classes/my/pkg路径下,无需额外修改配置,同时也兼容IDEA的运行逻辑。 - 方案2:修改sbt配置,指定scala目录下的资源文件需要拷贝
如果你不想移动文件位置,仍然要把file.txt放在src/main/scala/my/pkg/路径下,可以在项目的build.sbt文件中添加如下配置,让sbt识别scala目录下的txt文件为静态资源:
添加配置后执行sbt的// 方式1:将整个scala目录加入资源扫描路径 Compile / unmanagedResourceDirectories += (Compile / sourceDirectory).value / "scala" // 方式2(更精准):仅匹配scala目录下的txt文件,避免误拷贝其他无关文件 Compile / unmanagedResources ++= { (Compile / sourceDirectory).value / "scala" ** "*.txt" get }reload命令加载新配置,后续编译运行就会自动拷贝对应文件。 - 额外注意:优化文件读取逻辑
建议代码中使用类加载器的资源读取方法,避免硬编码本地文件路径,不管是本地运行还是打包成jar包都可以正常读取资源:// 示例写法,相对于当前类所在包路径读取资源 val inputStream = getClass.getResourceAsStream("file.txt") // 不要使用硬编码磁盘路径的写法,比如new File("src/main/xxx/...")
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

