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

本文详细解析了因pom.xml配置错误导致的java.lang.ArrayStoreException异常,特别是在将子项目从war包转换为jar包后,未正确调整servlet-api依赖导致的问题。通过使用arthas工具,作者展示了如何在无法进行传统debugger操作的服务器部署环境下,有效定位并解决异常,最终通过调整依赖范围解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将某个子项目从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.youkuaiyun.com/hengyunabc/article/details/79475505 https://github.com/alibaba/arthas

转载于:https://my.oschina.net/yuyizyk/blog/3012044

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值