最近在做一个RCP项目,项目中引用到了一个外部包smack.jar,于是在新建好了的plug-in project的properties中的java build path里面将smack.jar加到项目中来,按照既定的思路,一切正常,在项目的代码中引用到smack.jar中的类时也能正常的import进来,eclipse也没报错,编译也没有问题,写完了以后就run eclipse application或者run a product,结果发现应用界面出来了,但没有进一步的结果,console视图里面也没有任何的信息,于是debug进去看原因,发现代码运行到调用smack.jar包中的类时,出现了装载这个类失效,也就是出现了ClassNotFoundException,于是我觉得很纳闷,这个类不是已经加进来了吗?我顺带看了一眼加载这个类的classloader,是DefaultClassLoader,是属于osgi包中的一个类加载器。
然后我仍然不死心,就在当前的工程下任意找了一个class,然后在其中写了个main方法,直接调用smack.jar包中的那个类,然后run as a java application,结果成功了,这个时候又加载进来了,于是我又顺带看了一眼加载这个类的classloader,是Launcher$AppClassLoader,这个是属于jdk rt.jar包中就有的。
我郁闷了,彻底郁闷了,我不能理解,于是我觉得问题应该出在这两个classloader身上,于是学习了一遍classloader的东西,无果(学的比较懵懂),再请教我的同学,同学说不知道,最后还发了个email给个老外求教,暂时还没回音,后来我鼓起勇气,请教了在IBM实习时的同事,他指点了一下,说是在plug-in工程里面打开plugin.xml配置文件,跳到runtime tab,然后在classpath一项中,将所需要用到的包add进来,我照做,一试,灵了,我问他这个是什么原因,他说不清楚,他说他以前碰到过这样的情况,结果这样一做就可以了,我不解。。。。。。
后来一想,是不是真如我所想,之所以两次装载同一个类,结果不同,是不是真的是classloader的原因,也就是说,跟装载机制相关,我猜想,我以java application运行的时候,采用的装载机制,默认的将加入到java build path中的包加入到-classpath中来了,这样一来,类装载器就很顺利的把相应的类装载进来了,而以eclipse application或者product运行的时候,由于是osgi的机制,它可能不认那一套classpath,它的classpath是需要针对project自身来进行配置。所以加载不进来。仅仅是猜想而已,有待进一步证实!
此外,出了这么一件事,我对一个project的properties中的java build path的配置一项的实际功能就有些怀疑了,它到底能做到些什么?还有,编译的时候不出错又是因为什么?(编译原理忘光了,丢人了……)
然后我仍然不死心,就在当前的工程下任意找了一个class,然后在其中写了个main方法,直接调用smack.jar包中的那个类,然后run as a java application,结果成功了,这个时候又加载进来了,于是我又顺带看了一眼加载这个类的classloader,是Launcher$AppClassLoader,这个是属于jdk rt.jar包中就有的。
我郁闷了,彻底郁闷了,我不能理解,于是我觉得问题应该出在这两个classloader身上,于是学习了一遍classloader的东西,无果(学的比较懵懂),再请教我的同学,同学说不知道,最后还发了个email给个老外求教,暂时还没回音,后来我鼓起勇气,请教了在IBM实习时的同事,他指点了一下,说是在plug-in工程里面打开plugin.xml配置文件,跳到runtime tab,然后在classpath一项中,将所需要用到的包add进来,我照做,一试,灵了,我问他这个是什么原因,他说不清楚,他说他以前碰到过这样的情况,结果这样一做就可以了,我不解。。。。。。
后来一想,是不是真如我所想,之所以两次装载同一个类,结果不同,是不是真的是classloader的原因,也就是说,跟装载机制相关,我猜想,我以java application运行的时候,采用的装载机制,默认的将加入到java build path中的包加入到-classpath中来了,这样一来,类装载器就很顺利的把相应的类装载进来了,而以eclipse application或者product运行的时候,由于是osgi的机制,它可能不认那一套classpath,它的classpath是需要针对project自身来进行配置。所以加载不进来。仅仅是猜想而已,有待进一步证实!
此外,出了这么一件事,我对一个project的properties中的java build path的配置一项的实际功能就有些怀疑了,它到底能做到些什么?还有,编译的时候不出错又是因为什么?(编译原理忘光了,丢人了……)