使用sbt assembly构建Play Framework Jar运行报错:No root server path supplied
解决Play Framework Jar包运行报错"No root server path supplied"的方案
我碰到过好几个开发者遇到这个问题,本质是用sbt assembly打包Play项目后,服务器没法自动识别核心资源(配置文件、静态资源等)的根路径,下面是几个可行的解决办法:
启动时手动指定根路径参数
最简单的临时解决方式,直接在运行命令中添加-Dplay.server.http.rootPath参数,指向你的项目目录或者Jar所在的目录。比如:# 绝对路径示例 java -Dplay.server.http.rootPath=/home/your/project -jar jarName.jar # 相对路径(Jar在项目目录下时用) java -Dplay.server.http.rootPath=. -jar jarName.jar这个参数会告诉Play服务器去哪里寻找必要的配置和资源文件,补上之后就能正常启动了。
修改sbt assembly配置,内置默认根路径
如果你不想每次启动都手动加参数,可以在项目的build.sbt里修改assembly的打包配置,把根路径参数内置进去,同时处理好配置文件的合并问题(避免打包时覆盖):assemblyMergeStrategy in assembly := { case PathList("application.conf") => MergeStrategy.concat case PathList("reference.conf") => MergeStrategy.concat case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) } // 给打包后的Jar添加默认根路径参数 javaOptions in assembly += "-Dplay.server.http.rootPath=."修改完成后重新运行
sbt assembly打包,之后直接执行java -jar jarName.jar就能正常启动了。在配置文件中设置默认根路径
检查你的conf/application.conf,确保里面添加了服务器根路径的默认配置:# 可以根据实际情况调整路径,这里用当前目录作为默认 play.server.http.rootPath = "." play.server.http.port = 9000 # 可选,指定启动端口添加后重新打包,Play启动时会自动读取这个配置值,就不会再抛出路径缺失的错误了。
改用Play官方推荐的打包方式(可选)
如果sbt assembly的方式总是有路径问题,其实Play官方更推荐用sbt dist来打包,它会生成一个包含启动脚本的压缩包,自动处理所有路径相关的配置:- 执行
sbt dist命令,打包完成后会在target/universal目录下生成一个zip包 - 解压这个zip包到任意目录
- 进入解压后的目录,运行启动脚本:
- Linux/Mac:
bin/你的项目名称 - Windows:
bin/你的项目名称.bat
这种方式更适合生产环境部署,能避免很多自定义打包带来的兼容性问题。
- Linux/Mac:
- 执行
内容的提问来源于stack exchange,提问作者Bharat
相关产品推荐
相关产品推荐

