钳入式Jetty服务器Classloader问题

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

转载于:https://my.oschina.net/javagg/blog/3550

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值