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

时间:2013-05-13 19:33:50

标签: scala playframework playframework-2.0 sbt multi-module

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

  

解码时出现IO错误   C:\用户\网络\目标\斯卡拉-2.9.1 \ src_managed \主\意见\ HTML \ index.template.scala   使用UTF-8请尝试使用-encoding指定另一个   选项

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

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

哪里有问题?

5 个答案:

答案 0 :(得分:5)

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

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8'

然后SBT的第一行应该显示:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

答案 1 :(得分:4)

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

以下是流程:

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

当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编码的。如果将其设置为默认编码,则也可以这样做。

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

答案 2 :(得分:2)

以下对我来说很好。由eclipse(scala-ide)默认编码为utf-8

@(message: String)

@main("Welcome to Play 2.1") {
    <div>Ελληνικά</div>
    <div>
        @message
    </div>
    <br />
    <ul>
     @for(p<-message) {
     <li>
     @p
     </li>
      }
    </ul>

}

答案 3 :(得分:2)

您使用什么编辑器保存这些文件?您的角色可能有双重编码,因此错误地存储为UTF-8。例如。以iso-8859-1编码的字符再次编码为UTF-8。

答案 4 :(得分:1)

我遇到了这个问题并且发现它是由我在评论(ã)中使用的一些我的母语字符引起的。我删除了那些,错误消失了。