Scala Play 2.0.编译错误:解码时出现IO错误

我从GitHub(https://github.com/henrikengstrom/roygbiv)下载了多模块Scala项目,其中一个模块是Play 2.0模块.所以我可以使用SBT的运行命令在每个模块上运行整个应用程序,一切正常.但是当我添加到Play 2.0模板(index.scala.html)非英文字符并在浏览器中按F5时,我得到编译错误:

IO error while decoding
C:\Users…\web\target\scala-2.9.1\src_managed\main\views\html\index.template.scala
with UTF-8 Please try specifying another one using the -encoding
option

播放2.0模块我也使用SBT的运行命令,不使用播放控制台.

我检查了源文件编码 – 它是UTF-8.也尝试UTF-8没有BOM.

哪里可以问题?

最佳答案
你的问题似乎是这样的:你的中间scala文件编码不正确.

这是过程:

播放需要您的模板文件(foo.scala.html)并将其转换为Scala:target / scala-2.10 / src_managed / main / views / html / foo.template.scala.然后,它被sbt编译为.class文件并通过播放运行.

当sbt创建这些中间文件时,它会使用默认编码创建它们(在我的情况下是Windows机器,因此UTF-8没有BOM – 您的机器可能不同).重要的是,这种编码方式依然存在,所以即使我将原始模板文件(foo.scala.html)的编码更改为UTF-16,而.scala文件的编码仍然是一样的(UTF-8没有BOM在我的案件).但是,该文件不再编译,因为该文件无法读取,因为scala编译器期待ITF-8.

“正确”的解决方案是始终使用UTF-8,实际上这是推荐播放1.x的解决方案见Play documentation Internationalization.这里相当于play 2.您还可以使用普通的国际化消息文件.

所以,如果你指定

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' sbt

Bjorn所示,那么这将告诉sbt它读取和写入的所有文件将在UTF8中.您也可以在Build.scala中指定scala编译器的文件编码:

val main = play.Project(appName, appVersion, appDependencies).settings(
  scalacOptions ++= Seq("-encoding", "UTF-8")
  // Add your own project settings here      
)

这告诉scala编译器,它读取的所有文件(即foo.template.scala)都以UTF-8编码.如果将其设置为默认编码,这可能也是有效的.

你最好的办法是做一个sbt清洁,确保违规文件消失,并重新启动与JAVA_TOOL_OPTION如上所述.但是,您必须确保所有的构建都考虑到这一点(jenkins,其他开发者等).

转载注明原文:Scala Play 2.0.编译错误:解码时出现IO错误 - 代码日志