SBT项目发布时如何包含资源文件?
解决SBT发布Scala工具时资源文件缺失的问题
先排查默认配置是否被修改
SBT默认会自动将src/main/resources下的所有文件打包进编译后的JAR,并且包含在发布的构件中。如果资源没被打包,首先检查项目配置是否覆盖了默认规则:
- 查看
build.sbt或project目录下的.scala配置文件,有没有重写mappings in (Compile, packageBin)、resources in Compile这类设置——这类自定义操作很可能会意外排除资源文件。 - 如果确实有自定义的映射规则,确保手动把资源目录加回去:
mappings in (Compile, packageBin) ++= (resourceDirectory in Compile).value ** "*" pair relativeTo(resourceDirectory in Compile).value
显式声明资源目录(兜底方案)
如果不确定默认配置是否被干扰,可以显式指定资源目录,强制SBT包含这些文件:
unmanagedResourceDirectories in Compile += baseDirectory.value / "src" / "main" / "resources"
要是只想包含特定类型的资源,还可以添加过滤规则:
includeFilter in Compile in unmanagedResources := "*.conf" || "*.json" // 替换成你需要的文件后缀
本地打包验证,避免无效发布
发布到服务器前,先在本地验证资源是否已被打包:
- 执行
sbt package生成本地JAR - 到
target/scala-<你的Scala版本>目录找到生成的JAR文件 - 用
jar tf <工具名称.jar>命令查看JAR内的文件列表,确认资源文件存在
如果本地JAR里就没有资源,那问题出在项目配置,和发布流程无关。
注意依赖项目的资源读取方式
就算资源已经被打包进依赖JAR,也不能用本地文件路径(比如new File("resource.file"))读取——这种方式只会在当前项目的文件系统里找,不会去依赖JAR里找。正确的做法是用类加载器读取:
// 读取资源流 val resourceStream = getClass.getClassLoader.getResourceAsStream("necessary_resource") // 读取资源内容 val content = scala.io.Source.fromInputStream(resourceStream).mkString
确认发布的构件类型
如果发布的只有源构件(带-sources后缀的JAR),那资源不会被包含进去。sbt publish默认会发布二进制JAR、源JAR和文档JAR,确保依赖项目引入的是不带后缀的二进制JAR。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

