验证错误;期望方法 controllers.Secure$Security.authentify 中的堆栈映射帧
Posted
技术标签:
【中文标题】验证错误;期望方法 controllers.Secure$Security.authentify 中的堆栈映射帧【英文标题】:VerifyError; Expecting a stack map frame in method controllers.Secure$Security.authentify 【发布时间】:2011-07-15 08:06:04 【问题描述】:我按照介绍 Play 框架的教程进行操作,但它给了我一个错误:
执行异常 发生验证错误:在方法 controllers.Secure$Security.authentify(Ljava/lang/String;Ljava/lang/String;)Z 在偏移 33 处期望堆栈映射帧
我不确定我做错了什么。我正在使用的代码(sn-ps):
package controllers;
..
@With(Secure.class)
public class Application extends Controller
@Before
public static void setConnectedUser()
if (Security.isConnected())
User user = User.find("byEmail", Security.connected()).first();
user.password = null;
renderArgs.put("user", user);
...
对于安全类:
package controllers;
import models.*;
public class Security extends Secure.Security
static boolean authenticate(String username, String password)
return User.connect(username, password) != null;
我还将安全模块添加到 dependencies.yml 中,它在重新启动 Play 框架后正确加载。我将安全模型添加到我的路线中。 Eclipse 没有给出错误;错误只发生在执行时。 Secure.Security 类实际上具有可用的公共静态 isConnected 方法。我正在使用最新版本的 Play 框架 (1.2.2)。
【问题讨论】:
我可以看到 authentify 在 Play-source 中是 @Deprecated,但不确定它在哪里被调用,如果这导致异常? freeone3000 @ irc.freenode.org#java 建议这可能与我使用 JDK 1.7 的事实有关;带有字节码和验证的东西。会不会和invokedynamic
有关?
【参考方案1】:
Play 的消息组讨论了 JDK1.7 存在一些问题,并且 Play 尚未正式支持此功能。如果可能,请尝试使用 JDK 6,看看是否仍然出现此错误。
如果你仅限于JDK7,可以使用该选项
java.source=1.6
在您的 application.conf 文件中。
2011 年 8 月 18 日更新: Nicolas Leroux 最近在 Twitter 上发布了一条消息,称 Java 7 支持已添加到主分支的 Play 中。它可能不会发布 1.2.3,但会在之后发布。
【讨论】:
Play 1.2.4 RC3 支持 Java 7 - groups.google.com/forum/#!topic/play-framework/t2TQl3neUBI 确实如此。它确实错过了 1.2.3,但由于它在 master 中,它会自动添加到 1.2.4。 与关于 1.7 支持的公告所说的相反,情况似乎如此。这不仅为我解决了这个问题,而且我在尝试使用 SecureSocial 插件时看到了一个类似的问题,并且看到一些关于 1.7 也是问题的讨论(尽管我当时没有尝试修复它,所以我对那里的结果不积极)。但我可以证明我使用的是 Play 1.2.4 并且看到了同样的错误并且已经修复了它。 最新的候选版本 1.2.4 进行了一些更改以使其向后兼容 Java 5。因此,这可能会重新引入此错误。 1.3.x 将不支持 Java 5,所以我希望这个错误会在 1.3.x 中再次消失。 请注意,根据 Nicolas 的评论,您可以在 Java 1.7 上通过在命令行中添加 -XX:-UseSplitVerifier 标志来执行此操作。【参考方案2】:我有同样的问题,它似乎确实来自JDK7。
我解决了,补充
java.source=1.6
到application.conf文件,停止应用程序,删除应用程序tmp目录下的所有内容并重新启动它,即使你安装了JDK 1.7也应该可以工作
如果你不删除文件,play 将不会重新编译它们,它也不会工作,即使你回到 JDK 1.6
【讨论】:
【参考方案3】:您也可以使用-XX:-UseSplitVerifier
标志。
【讨论】:
这适用于 java 1.7; java 1.8 你应该将 -noverify 附加到 vm 选项【参考方案4】:我在运行我的 play 应用程序时遇到了同样的问题。 我正在使用 play 1.2.5 和 Java 1.7
我刚刚加了
java.source=1.6
在 application.conf 中。
然后删除tmp文件夹并重新启动应用程序,它就可以工作了。
【讨论】:
【参考方案5】:如果你想用jdk7也没关系。 只需确保您的 java 路径配置正确。 检查“java -version”和“javac -version”。
示例路径:
"C:\Program Files\Java\jdk1.7.0_07\bin" “C:\Program Files\Java\jdk1.7.0_07\jre\bin”【讨论】:
报告的问题实际上与生成的字节码不完全符合 java 7 的预期有关,而不是与您选择执行应用程序的 java 二进制文件有关以上是关于验证错误;期望方法 controllers.Secure$Security.authentify 中的堆栈映射帧的主要内容,如果未能解决你的问题,请参考以下文章
ECS 应用程序源包验证错误:我们期望一个 VALUE 令牌,但得到:START_ARRAY
我想检查自定义表单验证以获取数据库中的唯一用户ID,但是formGroup期望formGroup实例时出现错误