前些天使用jetty作为我程序的钳入式http和servlet服务器模块,后来为了方便管现程序的内存数据和停止服务器,那么我就写了一个jsp来调用相关的stop()方法
问题就来了,我通过jsp调用stop方法时发现我启动服务器时附的静态变量值居然为null,怪事
大家先来看看代码:
private static Server server;
public static void startHttp(int prot) {
server = new Server();
}
public static void stop(){
System.out.println(“server=”+server);
server.stop();
}
代码大约就是这样,正在百思不得其解的时候,我突然有一个想法,会不会是这个类被重新初始化了呢,于是我又加多了一个代码,一个final变量,如下:
private static final int i=Random.nextInt();
这个变量作为一个随机数,首先在starthttp()方法里打印出来,然后在stop里再打印一次,你会惊奇的发现,二个数不一样!!!
这时问题就好清楚了,就是这个类被初始化了二次,为什么呢,于是我分别在startHttp方法和stop方法里再加多一句打印语句
System.out.println(HttpServer.class.getClassloader());
果然,不一样!!!!
一个是sun的,一个是jetty自己实现的类
这时问题终于搞明白了,因为我启动服务器是通过java的命令的,当然这时classloader就是sun自带的loader,当我停止服务器时 因为是通过jsp的,要通过jetty的jsp解释器,jetty为了方便管理和实现自动加载等,把这个loader自己扩展了。
解决方法,把jetty的loader设为sun的loader
在jetty的WebAppContext类,可以设置这个应用的loader的,把他设成自己的就行了
webapp.setClassLoader(HttpServer.class.getClassLoader());
OK,收队
这里引一个问题出来:我们可以不可通过方法得到现在系统里的所有classloader呢????
www.javagg.com