钳入式Jetty服务器Classloader问题

原创
2010/03/31 18:18
阅读数 2.3K

前些天使用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

展开阅读全文
加载中

作者的其它热门文章

打赏
0
2 收藏
分享
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部