文档章节

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

_夜枫
 _夜枫
发布于 2017/03/17 11:24
字数 406
阅读 36
收藏 0

最近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;
  }

 

本文转载自:https://yq.aliyun.com/articles/60856

_夜枫
粉丝 10
博文 506
码字总数 0
作品 0
朝阳
后端工程师
私信 提问
JDK 升级问题小结

JDK8 发布很久了,它提供了许多吸引人的新特性,能够提高编程效率。 如果是新的项目,使用 JDK8 当然是最好的选择。但是,对于一些老的项目,升级到 JDK8 则存在一些兼容性问题,是否升级需要...

静默虚空
2017/11/08
0
0
Tomcat报java.lang.VerifyError错误

调试网页时候发现报这个错误:java.lang.VerifyError错误。 google了下,看网友们的评述感觉是的jar包的问题,于是仔细检查自己的情况; 发现了个奇怪的地方,可能是自己不小心拖动了jar包导...

zhengguogaun
2013/06/19
373
0
com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0

如果你在开发过程中遇到了上述的Bug,基本上是JDK版本不一致造成的,指的是高版本的JDK编译的class不能放在低版本的JDK上运行。 如果是Version 52,就表示JDK8编译的class不能运行在JDK7上,...

星雨gg
2016/09/29
15
0
Eclipse报错java.lang.VerifyError处理

java.lang.VerifyError: Expecting a stackmap frame at branch target 231 Exception Details: Location: com/hikvision/energy/gbmc/logManage/controller/LogInfoController.logList(Lcom......

V字仇杀
2018/01/18
138
0
java.lang.VerifyError解决方案 Android

今天遇到这样一个bug: java.lang.VerifyError: at android.support.v4.view.ViewPager.infoForAnyChild(ViewPager.java)at android.support.v4.view.ViewPager.populate(ViewPager.java:10......

今日竹石
2014/05/08
16.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
9
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部