【问题标题】:Scala Play 2.0. Compilation error: IO error while decoding斯卡拉玩 2.0。编译错误:解码时出现IO错误
【发布时间】:2013-05-07 22:35:48
【问题描述】:

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

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

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

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

哪里有问题?

【问题讨论】:

  • 开启第二个赏金,现在 300。

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


【解决方案1】:

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

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8'

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

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

【讨论】:

  • 将尽快尝试您的解决方案
  • @Mytitle 鉴于您对问题的描述,这很可能是解决方案
【解决方案2】:

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

流程如下:

Play 获取您的模板文件 (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,事实上这是推荐用于 play 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 clean,确保有问题的文件消失,然后按照上面的建议使用 JAVA_TOOL_OPTION 重新启动。但是,您必须确保所有构建都考虑到这一点(jenkins、其他开发人员等)。

【讨论】:

    【解决方案3】:

    以下内容对我来说很好。 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>
    
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我试过 Intellij IDEA 和 Notepad++
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 1970-01-01
        相关资源
        最近更新 更多