播放 2 scala 路由控制器字节码与所有其他字节码不同

Posted

技术标签:

【中文标题】播放 2 scala 路由控制器字节码与所有其他字节码不同【英文标题】:Play 2 scala route controller bytecode is not the same as all the other bytecode 【发布时间】:2012-05-13 13:59:33 【问题描述】:

我在 Mint 12、Play 2.0 上运行,并试图让 Proguard 工作,因为我的 Heroku slug 太大了。

所以,我使用xsbt proguard plugin,但它会出错,因为 ProGuard 不喜欢字节码格式 51。它是 ProGuard 4.7,所以它应该与 51 一起使用,但它不能:

[error] file:/(some path)/*:proguard: java.io.IOException: Can't read
[/(that path)/target/scala-2.9.1/(my app)_2.9.1-1.0-SNAPSHOT.jar]
(Can't process class [controllers/routes$ref.class]
(Unsupported version number [51.0] for class format))

所以,我看看罐子里的东西,几乎所有的行都是这样的:

./controllers/Application.class:  compiled Java class data, version 49.0 (Java 1.5)

但是路由器看起来是这样的:

./controllers/routes.class:       compiled Java class data, version 51.0

什么会使路由器选择与其他所有目标不同的目标?

我正在使用 Mint 附带的 JDK7,如果这很重要的话:

OpenJDK Runtime Environment (IcedTea7 2.0) (7~b147-2.0-0ubuntu0.11.10.1)
OpenJDK 64-Bit Server VM (build 21.0-b17, mixed mode

【问题讨论】:

您似乎没有使用 ProGuard 4.7。它支持 Java 7(类文件版本 51.0)。它还会为不受支持的 Java 版本生成不同的错误消息。 ProGuard 在运行时会打印出它的版本号,所以应该很容易检查。 Bleah,你是对的。我有一个较旧的插件版本,因为我盲目地遵循directions。指定最新的可以解决问题。 【参考方案1】:

routes.class有不同的字节码格式,因为它是由javac从自动生成的编译

target/scala-version/src_managed/controllers/routes.java

而其他类文件由 scala 编译器生成。

【讨论】:

谢谢,我想是这样的;不过,我浏览了 Play 代码,但找不到设置 -target 选项的任何地方。【参考方案2】:

以下是减少 Heroku 上 Play 2 应用程序块大小的解决方法:https://groups.google.com/d/topic/play-framework/R_BbIomWsqI/discussion

【讨论】:

嗯,是的,我是 doing that,这很有帮助,但我的 slug 仍然(稍微)超出了限制。我还担心 Heroku 上的测功机大小,所以我正在转向 EC2 实例。 嗯,有几件事。运行“sbt stage”会产生大约 175MB。公共有一个胖静态子模块,27MB。 target/staged 中的应用程序 jar 为 21MB。所有的 target/staged 总共是 65MB,在 target/scala-2.9.1 中还有 51MB,所以 target 是 115MB。模块中有代码子模块,28MB。我可能最容易缩小静态公共子模块,但我不确定还有什么可以攻击的。 ...哦,实际上更仔细地观察它,我的子模块存储库是否有可能以某种方式被包含在内?这些是子模块大小的很大一部分。 “静态子模块”是什么意思? 好的。但是 27MB 的 javascript 呢?另外我相信public 目录内容可能会被复制到已编译的 JAR 中。 好问题。我不知道。我可能会将该 git 子模块中的任何内容切换为 JAR 依赖项。但是,您需要将依赖项放入本地 repo 以便 Heroku 解决它:devcenter.heroku.com/articles/local-maven-dependencies

以上是关于播放 2 scala 路由控制器字节码与所有其他字节码不同的主要内容,如果未能解决你的问题,请参考以下文章

播放框架:将控制器和路由打包为依赖关系的 jar

ASCII码与BCD码的区别

播放2.6 [Scala]:如何在测试期间访问日志内容?

深入理解Java虚拟机——字节码与数据类型

深入理解Java虚拟机——字节码与数据类型

节:字节码与多语言混合编程