java.lang.ArrayStoreExceptionsun.reflect.annotation.TypeNotPresentExceptionProxyBUG排查

coding

将某个子项目从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

以上是 java.lang.ArrayStoreExceptionsun.reflect.annotation.TypeNotPresentExceptionProxyBUG排查 的全部内容, 来源链接: utcz.com/z/509150.html

回到顶部