共计 1567 个字符,预计需要花费 4 分钟才能阅读完成。
为了使用最新的 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 升级成功完成。