java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy BUG排查

杀马特。学长 韩版系。学妹 提交于 2021-02-18 02:25:18

将某个子项目从war包转化为jar包打包方式后。忘记修改pom.xml中对servlet-api等的修改。

<dependency>
	<groupId>javax</groupId>
	<artifactId>javaee-api</artifactId>
	<version>8.0</version>
	<scope>provided</scope>
</dependency>

因此在开发环境中,因为ecplise中自带有javaee-api包。没有发现任何问题,然后在用java -jar方式中运行时,出现BUG

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

在类似服务器部署环境没法进行debugger的条件下,正好这两天看了arthas 可以类似aop,监听某方法的调用等。刚好能查看一下这个莫名奇妙的异常信息。

arthas 的操作主要有两步:

  • 打开 arthas options unsafe (对系统级别的类进行增强)。因为sun.reflect.annotation.TypeNotPresentExceptionProxy类是系统类,直接watch监听会报No class or method is affected;
  • watch sun.reflect.annotation.TypeNotPresentExceptionProxy * params[1] 此处因为TypeNotPresentExceptionProxy的构造器的定义是 TypeNotPresentExceptionProxy(String var1, Throwable var2),我选择的是看异常堆栈信息。

于是就终于看到正常的异常信息了:

$ watch sun.reflect.annotation.TypeNotPresentExceptionProxy * params[1]
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:2) cost in 96 ms.
ts=2019-02-19 16:54:24; [cost=1.9308ms] result=java.lang.ClassNotFoundException: javax.json.bind.Jsonb
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(Unknown Source)

最后,去掉pom中的 scope 节,就可以在MANIFEST.MF 中查看到javaee-api包。项目正常运行。

参考: https://blog.csdn.net/hengyunabc/article/details/79475505 https://github.com/alibaba/arthas

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!