为了使用最新的Play WS Api,升级到play 2.6.21
1.配置修改
根据官网的升级指南,修改plugins.sbt文件,更改插件版本号: addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.21")
build.sbt文件中,把guice和play-json单独加入。
libraryDependencies += guice libraryDependencies += "com.typesafe.play" %% "play-json" % "2.6.0"
build.sbt中修改依赖库cache和JavaWs的名字为ehcache和ws。修改后如下
libraryDependencies ++= Seq( javaJdbc , ehcache , ws)
然后点击菜单 View/Tool windwos/SBT
打开sbt窗口,点击刷新,然后下载新的依赖包,虽然消耗不少时间,最终顺利完成,没有遇到太大麻烦。
2.运行
修改完配置之后,运行play(使用 sbt run命令)。提示 /views/index.scala.html:18: not found: value welcome
。此文件为首页的Twirl模板。
推测可能是2.6版本和2.5版本的首页模板不同,于是到官网下载2.6版本的starter-example,找到 views/index.scala.html
并覆盖项目的相应文件。再次运行,还是提示同样错误。
这个错误的原因是views.html包下没有welcome对象,views.html.play20包下也没有,据说是因为低版本的play下载了某个低版本依赖包,导致高版本play不再下载新版本的依赖包导致。此问题无法解决,因为这个欢迎页面可有可无,因此最终决定从 views/index.scala.html
中删除@welcome的调用。编译通过,开发模式下运行没有问题。
3.生产环境部署
和上一版本一样,命令行上 运行sbt dist或者sbt universal:packageBin打包项目为zip文件。复制到服务器上,解压zip文件,运行/bin/xxxx.bat启动web服务器,出现“输入行太长”的错误无法启动web服务器。
直接原因是java -cp "..." 命令太长,超过windows命令行8000字节的限制,导致windows无法执行此命令。这个命令长的部分是 -cp后面指定的jar包文件,因为依赖的jar包太多,sbt把jar文件名全部串接起来放在cp后面,导致这个参数非常长。上一版本还勉强没超过限制,升级到新版本后,依赖包又增加了很多个,导致命令长度超限制。
“输入行太长”错误的一般解决方法是,把bat文件所在路径的基础路径名尽可能缩短,把bat的上两级目录的文件夹名缩短到2个字符,再运行bat文件,这时不再报“输入行太长”错误,但出现新错误“无法找到或者加载主类play.core.server.ProdServerStart”的错误。
一开始怀疑是javac选项或者jdk版本导致的,用了很长时间排查仍然无法解决问题,在stackoverflow上找到的方法也不成功。偶然想到,这个错误是不是也是因为命令长度太长导致的,于是在stackoverflow上找到一个彻底解决命令太长的方法。在build.sbt文件中添加插件LauncherJarPlugin,本来不抱太大希望,想不到运行sbt start竟然成功了,然后打包部署也成功了。添加插件LauncherJarPlugin的语句:
lazy val `xxxx` = (project in file(".")).enablePlugins(PlayJava,LauncherJarPlugin)
至此,play framework2.6.21升级成功完成。