PlayFramework 2.6.12:HTTPS模式下无法读取conf目录相对路径JKS文件
我来帮你搞定这个HTTPS配置的坑!你遇到的问题核心是相对路径在生产模式下的解析逻辑和开发模式不一样,DefaultSSLEngineProvider会以当前运行的工作目录为基准查找文件,但sbt stage打包后,你的JKS文件可能没被同步到正确位置,或者路径引用方式不对。
下面是几个可靠的解决方案:
方案1:用Classpath路径加载JKS文件(推荐)
Play会自动把conf目录下的文件加入应用的classpath,直接用classpath:前缀引用文件即可,不管是开发还是生产环境,都能正确找到文件。修改你的application.conf:
play.server.https.keyStore { path = "classpath:cacert.jks" type = "JKS" password = "n0t_@_$ecret!" }
这个方法最省心,不用管文件复制的问题,Play会自动处理资源加载。
方案2:确保JKS文件被打包到发布目录
如果你坚持用相对路径,需要让sbt在打包时把cacert.jks复制到stage的conf目录里。在你的build.sbt中添加以下配置:
unmanagedResources in Compile += baseDirectory.value / "conf" / "cacert.jks"
添加后重新运行sbt stage,此时target/universal/stage/conf目录下就会有你的JKS文件,相对路径conf/cacert.jks就能正常被解析。
方案3:手动复制文件(临时应急)
如果只是临时测试,可以手动把conf/cacert.jks复制到sbt stage生成的target/universal/stage/conf目录下,再启动应用。不过这个方法不适合正式环境,每次打包都要手动复制太繁琐。
为什么原来的配置会报错?
你看到的错误提示Unable to find HTTPS keystore at "/api/target/universal/stage/conf/cacert.jks"说明,Play在生产模式下运行时,工作目录是target/universal/stage,它会在这个目录下找conf/cacert.jks,但默认情况下sbt不会把conf下的非配置文件(比如JKS)自动复制到stage目录,所以才会找不到。
内容的提问来源于stack exchange,提问作者Artavazd Balayan

