有关java.lang.ClassNotFoundException和Class not found的疑问

霜逸 发布于 2012/05/29 12:01
阅读 12K+
收藏 1

【领华为电脑包】容器化时代到来!跳转机分配问题终于“有救”了!>>>

调试一个ERP系统时,进行了一些操作后,点击了按钮,然后整个界面没有动作。查看日志文件,看到了下面一段记录:

Exception in thread "Thread-15" nc.bs.framework.exception.FrameworkConnectorException: Read/Witer object error
at nc.bs.framework.comn.cli.JavaURLCommunicator.request(JavaURLCommunicator.java:73)
at nc.bs.framework.comn.cli.ClientProxyImpl.urlCall(ClientProxyImpl.java:184)
at nc.bs.framework.comn.cli.ClientProxyImpl.invoke(ClientProxyImpl.java:135)
at $Proxy6.showMessageAlertFileNameByLogin(Unknown Source)
at nc.ui.pub.msg.MessageReceiveThread$2.run(MessageReceiveThread.java:222)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: NCClassLoader(Cache), Class not found:javax.ejb.EJBException
at nc.bs.framework.codesync.client.NCClassLoader.loadClass(NCClassLoader.java:60)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at nc.bs.framework.comn.NetObjectInputStream$NCObjectInputStream.resolveClass(NetObjectInputStream.java:57)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at nc.bs.framework.comn.Result.readExternal(Result.java:40)
at java.io.ObjectInputStream.readExternalData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at nc.bs.framework.comn.NetObjectInputStream.readObjectOverride(NetObjectInputStream.java:205)
at java.io.ObjectInputStream.readObject(Unknown Source)
at nc.bs.framework.comn.NetObjectInputStream.readObject(NetObjectInputStream.java:271)
at nc.bs.framework.comn.cli.JavaURLCommunicator.request(JavaURLCommunicator.java:64)
... 5 more

java.lang.ClassNotFoundException是加载类时,没有找到相应的类。在这里,就是NCClassLoader这个类没有找到。而NCClassLoader则是在fw.jar这个包中的。

但是我通过websphere(整个系统是跑在was上的)的“类装入器查看器”发现,fw.jar这个包是已经被装入的
file:/ufida/testnchome1218/nchome/external/lib/fw.jar
而且这个jar包中的确有NCClassLoader这个类。

而那个Class not found的javax.ejb.EJBException是在j2ee.jar这个包中的。而这个包被先后装载了三次
file:/opt/IBM/WebSphere/AppServerNew/lib/j2ee.jar
file:/opt/IBM/WebSphere/AppServerNew/lib/j2ee.jar
file:/ufida/testnchome1218/nchome/lib/j2ee.jar
怀疑这里可能是两个jar包冲突了。删了/ufida/testnchome1218/nchome/lib/j2ee.jar(删/opt/IBM/WebSphere/AppServerNew/lib/j2ee.jar后was就启用不起来了),但是重启后,问题依旧。

希望大家帮忙分析一下,谢谢了。

以下是问题补充:

@霜逸:后来发现日志中有如下的错误nc.bs.framework.exception.ComponentCreateException: Component: nc.itf.uap.pa.PreAlertEJB,Detail Message: remove temp ejb Object error …… Caused by: javax.ejb.EJBException: See nested exception; nested exception is: nc.bs.framework.exception.ComponentCreateException: Component: nc.itf.uap.pa.PreAlertEJB,Detail Message: component state is error, state: -2147483626 causes: populate component property: iPreAlertConfigService with reference: IPreAlertConfigService error: Container: uap,Component: IPreAlertConfigService,Detail Message: state: -2147483626 causes: The component can't get the Instantiator correctly …… 应该是部署的过程中出问题了 (2012/05/31 14:54)
加载中
0
忆童
忆童
Class not found:javax.ejb.EJBException
忆童
忆童
回复 @风雪山神庙 : 我的意思是包是加载了,问题是被谁加载了?
忆童
忆童
回复 @风雪山神庙 :
霜逸
霜逸
回复 @忆童 : 通过websphere的classloader查看器,发现相应的包都加载了。现在怀疑是部署的问题,正在尝试解决。
忆童
忆童
回复 @风雪山神庙 : 我大概明白你的问题了,昨天我遇到了相似的问题. 问题的原因是你的类加载器NCClassloader找不到EJBException,意思是说,你的j2ee.jar包,需要让NCClassloader进行加载,具体如何配置你,可以根据这个思路查一查
霜逸
霜逸
回复 @忆童 : 不过我通过was里的类加载查看工具,发现exception所在的j2ee.jar已经被加载上了。还发现不了,难道是部署有问题。不过我已经重新部署过两次了,没报什么错误。
下一页
0
sxgkwei
sxgkwei
clear project
霜逸
霜逸
这玩意没法clear,运行环境上的东西,而且不起作用的是平台自带的节点,而不是后来二次开发的。也怪我没说清楚。
0
chally
chally

做用友NC的吧。

这个要看是开发环境还是运行环境报的错误了。

霜逸
霜逸
是NC,运行环境的,本地用代码跑是没有问题的,想放到测试环境上测一下,可是一直用不了。
0
chally
chally
一般是部署EJB得问题,尤其是在WAS上跑,你可以先试下用友自己的中间件上跑下,如果没问题的话,那就是Was部署的问题了,最好是把已生成的EJB文件全删除,重新部署一次。
霜逸
霜逸
还需要请教一下,删除生成的EJB文件是通过“集成解决方案控制台”的某个节点还是直接删除websphere中某个目录下的文件?以前没接触websphere,网上没搜到(可能是太基础了)。
霜逸
霜逸
嗯,应该是was部署的事,昨天翻日志的时候发现了报了EJB生成的异常。我试试把EJB删除再重新部署一下。
0
邸星星
邸星星
遇到过类似问题,在tomcat下可以用classloader.getResource加载jar中的class,但放到websphere下就不行了。后来改为从文件系统中读取class了。很想知道更好的方法(比如本帖提到可能是部署问题)。
0
杨延庆
杨延庆
直接把jar包路径放到classpath里可以么?
霜逸
霜逸
这个我试过,没有起作用,现在看看是不是部署的问题
0
霜逸
霜逸
问题解决了,的确是部署的事。 组件 IPreAlertConfigService生成的有问题,找到了相应的配置文件,更改了一下配置就可以了。
0
泡泡哥
泡泡哥
仔细检查一下你Jar包的名字,肯定是包名字大小写错了,或者是xxx.xxx,xxx这里面写错字母了。我也出现过这样的低级问题。JAVAC 是没有问题,一到java class都是这些。好好看代码。还有包名称
返回顶部
顶部