zoukankan      html  css  js  c++  java
  • 升级到JDK8,编译时发生 Error:java: java.lang.ExceptionInInitializerError

    编译的时候出现这个问题。使用1.7的jdk没问题,但是由于po主的项目中,使用了java8编写的代码,解决java8兼容问题成为解决这个问题的首选方案。

    这个日志太过简单,只告知一个异常信息,这个异常发生的原因主要是由于静态类,静态变量初始化时发生了异常,po的项目是个很早的项目,静态类太多,无法直接定位异常信息到底是如何产生,控制台也没有输出堆栈,这给排查问题带来了极大的不便,第一个要解决的应该就是讲详细的堆栈信息输出,能方便的定位到问题的根源。

    注意到第三条Infomation,Compliation completed with 1 error..... 这说明,异常产生时是在编译阶段,先去看看Idea的build的日志。日志的目录在 

    /Users/xxxx/Library/Logs/IdeaIC2016.1/build-log

    打开bulid.log,可以看到具体的异常的堆栈信息。

    从堆栈的信息来看,lombok.javac.Javac.getCtcInt 应该是出现了版本兼容的问题。找下万能的google后

    https://intellij-support.jetbrains.com/hc/en-us/community/posts/205434150-IDEA-2016-3-compile-error-please-help-

    这个同学发生了相同的问题,检查了下我的IDEA的版本,这位同学的IDEA版本是 2016.3。po下我的:

    IntelliJ IDEA 2016.1.1

    Build #IC-145.597, built on March 29, 2016
    JRE: 1.8.0_40-release-b132 x86_64
    JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

    版本还比较这位同学的要旧一些,所以!先升级一下IDEA吧!升级去了,待会来po是不是已经解决!

    +++++++++++++++++++++++++我是华丽的分割线++++++++++++++++++++

     IDEA升级完成后,发现编译依然还是有问题,发生同样的错误,那位同学发生的那个问题其实更偏重于IDEA默认选择了jdk1.8来编译,所以想解决怎么回去到 1.7,而并没有解决掉1.8与lombok的某些版本不兼容的问题。

    于是不得不从原理上先去了解下lombok。

    lombok是什么?

    简单的一句话说,lombok是个编译期的注解工具,注解的主要的目的就是为了能少写一些枯燥的java代码,比如getter,setter之类的。使用lombok就能在编译期间,将你使用注解标注生成代码已完成编译过程。

    详情:https://projectlombok.org/

    从异常上看,这个有点像版本不匹配造成的,NoSuchFiled,应该是版本太低的原因。于是我脑残的觉得,是IDEA的lombok的插件的问题造成的,升级了一下lombok的Idea的插件,问题依旧!

    这个项目不是我的,对依赖并不了解。既然不是插件的问题,如果项目中需要使用lombok的注解,那项目一定需要依赖lombok。

    mvn dependency:tree 打出依赖树,果真,在项目中有使用lombok的0.12的一个版本的依赖。

    实在是纳闷,这种包应该是在编译期间使用呀,为啥会被二方包依赖进来,scope应该是provided。

    于是将 lombok的包Exclusion掉。世界瞬间变美好起来!

    我来总结一下:在JDK1.7的环境下,lombok的 0.12的版本并不存在问题。编译没啥问题。升级到JDK8之后,lombok的0.12版本不兼容,于是出现了编译器的错误。这个时候你需要升级你的lombok的版本,如果你使用的是maven生命周期管理工具,记得把scope设置成 provider,发布二方包的同学,这种包就不要打进二方包里面了。

    原文地址:https://www.cnblogs.com/zhoukedou/p/7007972.html
  • 相关阅读:
    linux 操作命令
    Linux 安装问题
    margin和text-align实现水平居中的区别
    javascript关键字typeof、instanceof、constructor判断类型
    jquery经常用到的代码段
    Ubuntu安装Chrome浏览器及解决启动no-sandbox问题
    github基本使用---从零开始
    Jquery的load加载本地文件出现跨域错误的解决方案
    meta标签中设置以极速模式打开网页
    原生js动态创建文本内容的几种方式
  • 原文地址:https://www.cnblogs.com/jpfss/p/11114618.html
Copyright © 2011-2022 走看看