低版本mvel在MaxCompute jdk8环境中报java.lang.VerifyError

最近MaxCompute在升级jdk8的环境,导致线上使用到MVEL的离线任务挂掉,主要是下面这个异常
Exception in thread "main" java.lang.VerifyError: (class: ASMAccessorImpl_4458843621386333353870, method: getKnownEgressType signature: ()Ljava/lang/Class;) Illegal type in constant pool

经过一系列查找最终确定这个是低版本mvel的bug,主要是ASMAccessorOptimizer这个类对高版本java没有处理,已经得到官方确认 https://github.com/mvel/mvel/pull/84

https://github.com/mvel/mvel/blob/mvel2-2.0.1/src/main/java/org/mvel2/optimizers/impl/asm/ASMAccessorOptimizer.java


/**
 * Implementation of the MVEL Just-in-Time (JIT) compiler for Property Accessors using the ASM bytecode
 * engineering library.
 * <p/>
 */
@SuppressWarnings({"TypeParameterExplicitlyExtendsObject", "unchecked", "UnusedDeclaration"})
public class ASMAccessorOptimizer extends AbstractOptimizer implements AccessorOptimizer {
  private static final String MAP_IMPL = "java/util/HashMap";

  private static String LIST_IMPL;
  private static String NAMESPACE;
  private static final int OPCODES_VERSION;

  static {
    final String javaVersion = getProperty("java.version");
    if (javaVersion.startsWith("1.4"))
      OPCODES_VERSION = Opcodes.V1_4;
    else if (javaVersion.startsWith("1.5"))
      OPCODES_VERSION = Opcodes.V1_5;
    else if (javaVersion.startsWith("1.6") || javaVersion.startsWith("1.7"))
      OPCODES_VERSION = Opcodes.V1_6;
    else
      OPCODES_VERSION = Opcodes.V1_2;
      String defaultNameSapce = getProperty("mvel2.namespace");
      if (defaultNameSapce == null) NAMESPACE = "org/mvel2/";
      else NAMESPACE = defaultNameSapce;

      String jitListImpl = getProperty("mvel2.jit.list_impl");
      if (jitListImpl == null) LIST_IMPL = NAMESPACE + "util/FastList";
      else LIST_IMPL = jitListImpl;
    }

从上面代码可以看到对于1.8的环境属于else部分,所以官方对这部分代码进行了升级
详见https://github.com/mvel/mvel/blob/master/src/main/java/org/mvel2/optimizers/impl/asm/ASMAccessorOptimizer.java

/**
 * Implementation of the MVEL Just-in-Time (JIT) compiler for Property Accessors using the ASM bytecode
 * engineering library.
 * <p/>
 */
@SuppressWarnings({"TypeParameterExplicitlyExtendsObject", "unchecked", "UnusedDeclaration"})
public class ASMAccessorOptimizer extends AbstractOptimizer implements AccessorOptimizer {
  private static final String MAP_IMPL = "java/util/HashMap";

  private static String LIST_IMPL;
  private static String NAMESPACE;
  private static final int OPCODES_VERSION;

  static {
    final String javaVersion = PropertyTools.getJavaVersion();
    if (javaVersion.startsWith("1.4")) {
      OPCODES_VERSION = Opcodes.V1_4;
    } else if (javaVersion.startsWith("1.5")) {
      OPCODES_VERSION = Opcodes.V1_5;
    } else if (javaVersion.startsWith("1.6")
            || javaVersion.startsWith("1.7")
            || javaVersion.startsWith("1.8")
            || javaVersion.startsWith("9")) {
      OPCODES_VERSION = Opcodes.V1_6;
    } else {
      OPCODES_VERSION = Opcodes.V1_2;
    }

    String defaultNameSapce = getProperty("mvel2.namespace");
    if (defaultNameSapce == null) NAMESPACE = "org/mvel2/";
    else NAMESPACE = defaultNameSapce;

    String jitListImpl = getProperty("mvel2.jit.list_impl");
    if (jitListImpl == null) LIST_IMPL = NAMESPACE + "util/FastList";
    else LIST_IMPL = jitListImpl;
  }

文章转自wangheng

更多问题欢迎加入MaxCompute钉钉群讨论

时间: 2024-08-31 15:42:45

低版本mvel在MaxCompute jdk8环境中报java.lang.VerifyError的相关文章

hibernate简单小程序中报 java.lang.IllegalAccessError错误

问题描述 hibernate简单小程序中报 java.lang.IllegalAccessError错误 我刚开始自学hibernate,跟着视频敲了个小程序,只是实现向数据库employee表中插入一条数据,可是debug运行到 Configuration configuration = new Configuration().configure(); 时就开始抛出 Exception in thread "main" java.lang.IllegalAccessError: tr

调用注册时出错【版本easemobchat_2.2.6.jar,报java.lang.String com.easemob.chat.core.j$c.c】

问题描述 报错:Attempt to read from field 'java.lang.String com.easemob.chat.core.j$c.c' on a null object reference 源码: 解决方案 注册中的toast操作在ui线程中执行

低版本IE正常运行HTML5+CSS3网站的3种解决方案

 现在我们可以选择浏览器非常多,所以浏览器的环境也是种类繁多,同一个浏览器也是包含各种不同的版本,不同的版本之间的渲染方法也存在差异,它们支持的 HTML5.CSS3 特性恐怕也不尽相同.这种情况于是造成Web开发者在开发网站时,要面对数量庞大的浏览器种类 如果开发时按最低标准,比如IE6不支持的特性,我们统统不用,那就没有必要写这篇文章了:但我想这种情况极少,更多的开发,是在现代浏览器上使用它们支持的特性,而在早期浏览器上做一定的降级处理,这就是所谓 "渐进增强",也是本文要说的重点

thinkphp在低版本Nginx 下支持PATHINFO的方法分享_php技巧

最近在用thinkphp做一个项目,基本完成后部署到nginx服务器上才发觉nginx是不支持pathinfo的那么我们如何来处理呢. Nginx环境 在Nginx低版本中,是不支持PATHINFO的,但是可以通过在Nginx.conf(在/usr/local/nginx/conf/nginx.conf或者通过find / | grep nginx.conf来查找位置)中配置转发规则实现:在nginx配置文件中添加: location / { if (!-e $request_filename)

用EXP/IMP从高版本数据库导出至低版本数据库导入实验

一般来说,从低版本数据库EXP数据,导入至高版本数据库是没什么问题的,因为Oracle数据库在开发设计的时候,考虑了同以前版本的兼容.但是从高本数据库EXP导出数据,导入至低版本数据库,经常会有各种各样的问题. 在,在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决: 1).在高版本数据库上运行底版本的catexp.sql:11G的库里运行10G数据库软件下ORACLE_HOME/rdbms/admin/catexp.sql 2).使用低版本的EXP来导出高

如何Word2013保存为低版本格式

  Word2013保存为低版本格式步骤如下: 步骤1:首先,我们打开电脑上的Word2013软件,鼠标左键右击左上方任务栏,从弹出的菜单中选择自定义快速访问工具栏. 步骤2:弹出Word选项对话框,从下拉位置选择命令:Office菜单,找到Word97-2003文档,单击添加按钮,加入到右侧. 步骤3:确定之后,返回主页面,点击左上方的保存按钮开始进行文档保存设置. 步骤4:由于是高版本,所以默认的就是docx格式,这是2003打不开的,需要下载兼容包. 步骤5:经上述步骤设置,我们可以在保存

兼容低版本 IE 的 JScript 5.5 实现

js|jscript IE 5.5 中的 JScript 版本是 5.5 版,它比以前版本的 JScript 中多了如数组的 push.pop.shift.unshift 方法和 encodeURI.decodeURI 等一些重要的函数.而这些增加的内容在目前其他浏览器(如 Moziila/Firefox 和 Opera)上也同样支持.因此目前开发网站一般对于 IE 浏览器只能兼容到 5.5 版,而对于更低版本的 IE(如 IE 5.IE 4 等),则不再去考虑了.虽然这些低版本的 IE 浏览器

兼容低版本IE的JScript5.5实现

js|jscript 作者Blog:www.coolcode.cn IE 5.5 中的 JScript 版本是 5.5 版,它比以前版本的 JScript 中多了如数组的 push.pop.shift.unshift 方法和 encodeURI.decodeURI 等一些重要的函数.而这些增加的内容在目前其他浏览器(如 Moziila/Firefox 和 Opera)上也同样支持.因此目前开发网站一般对于 IE 浏览器只能兼容到 5.5 版,而对于更低版本的 IE(如 IE 5.IE 4 等),

在低版本的vc中使用vc 10.0的新特性

/*! 在低版本的vc中使用vc 10.0的新特性 created by : andrew.wu (erpingwu@gmail.com) */ vc 10.0提供了一些新的特性,最引人注目的莫过于lambda, 但vs2010 beta内存占用之多也不得不让人心生退让. 高手 7cat 指出 "vc ide 只是一个壳" 那么如果利用 vc 10.0 编译器的新功能? 以vc9为例, 注意 Tools->Projects and Solutions->VC++ Direc