将某个子项目从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
来源:oschina
链接:https://my.oschina.net/u/3632223/blog/3012044