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

MyT*_*tle 10 scala sbt multi-module playframework playframework-2.0

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

使用UTF-8解码C:\ Users ...\web\target\scala-2.9.1\src_managed\main\views\html\index.template.scala时出现IO错误请尝试使用-encoding选项指定另一个

Play 2.0模块我也使用SBT的run命令运行,而不是使用Play控制台.

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

哪里可以有问题?

Bjö*_*obs 5

您可以尝试使用强制编码将SBT启动到UTF-8.我在这篇文章中读到,对于某些人来说,它有助于使用以下选项启动SBT:

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8'
Run Code Online (Sandbox Code Playgroud)

那么SBT的第一行应该显示:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Run Code Online (Sandbox Code Playgroud)


Mat*_*ell 4

您的问题似乎是这样的:您的中间 scala 文件编码不正确。

这是过程:

Play 获取您的模板文件 ( foo.scala.html) 并将其转换为 Scala:target/scala-2.10/src_managed/main/views/html/foo.template.scala。然后由 sbt 编译为 .class 文件并通过 play 运行。

当 sbt 创建这些中间文件时,它使用默认编码创建它们(在我的例子中是 Windows 机器,因此是没有 BOM 的 UTF-8 - 您的机器可能有所不同)。重要的是,这种编码仍然存在,因此即使我更改原始模板文件的编码(foo.scala.html 为 UTF-16),.scala 文件的编码仍然是相同的(在我的模板文件中没有 BOM 的 UTF-8)案件)。但是,该文件不再编译,因为无法读取该文件,因为 scala 编译器需要 ITF-8。

“正确”的解决方案是始终使用 UTF-8,事实上,这是为 play 1.x 推荐的解决方案,请参阅Play 文档 国际化这是play 2的等效项。您还可以使用普通的国际化消息文件。

所以,如果你指定

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' sbt
Run Code Online (Sandbox Code Playgroud)

正如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      
)
Run Code Online (Sandbox Code Playgroud)

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

最好的办法是执行 sbt clean,确保有问题的文件已消失,然后按照上面的建议使用 JAVA_TOOL_OPTION 重新启动。但是,您必须确保所有构建都考虑到这一点(jenkins、其他开发人员等)。