自定义ClassLoader在Tomcat中的有关问题
自定义ClassLoader在Tomcat中的问题
公司要求做加密,于是上网搜啊,都说加密重要的.class,自定义ClassLoader加载加密的class,其实我感觉也没有用,defineClass时还是要解密。但是其间遇到一个问题一直不知道什么原因:
Jdk1.6 Tomcat5.5
自定义的ClassLoader类:MyClassLoader
待解密的类:LicenseUtils
我用MyClassLoader加载LicenseUtils时的代码:
LicenseUtils类中init方法:
这么写是没有问题的,但是如果我在init方法里面调用第三方类(不是系统的类),就会出现ClassNotFoundException,找了半天也不知道什么原因,而且仅仅是在Tomcat里面运行出错,在main方法里面做测试是木有问题的。
我思忖,Java Application 和 Web Application有什么区别呢?
Jdk有三个ClassLoader,利用委派方式加载类,Tomcat定制了自己一系列的ClassLoader来加载类,我自己写
的MyClassLoader继承自Jdk的ClassLoader,Tomcat的WebAppClassLoader继承自URLClassLoader,URLClassLoader又继承自ClassLoader。
查了Apache的Mailing Lists发现有人说Tomcat只能用继承自WebAppClassLoader的ClassLoader
有人遇到过吗?或者看出有什么问题的
公司要求做加密,于是上网搜啊,都说加密重要的.class,自定义ClassLoader加载加密的class,其实我感觉也没有用,defineClass时还是要解密。但是其间遇到一个问题一直不知道什么原因:
Jdk1.6 Tomcat5.5
自定义的ClassLoader类:MyClassLoader
待解密的类:LicenseUtils
我用MyClassLoader加载LicenseUtils时的代码:
Class c = loadClass("xx.LicenseUtils")); Method m = c.getDeclaredMethod("init", new Class[]{}); m.invoke(c.newInstance(), new Object[]{});
LicenseUtils类中init方法:
public void init() { System.out.println("init method"); }
这么写是没有问题的,但是如果我在init方法里面调用第三方类(不是系统的类),就会出现ClassNotFoundException,找了半天也不知道什么原因,而且仅仅是在Tomcat里面运行出错,在main方法里面做测试是木有问题的。
public void init() { //自定义的类 License com.test.encrypt.License lic = new com.test.encrypt.License(); //如果是第三方的jar包也报错 System.out.println("init method"); }
我思忖,Java Application 和 Web Application有什么区别呢?
Jdk有三个ClassLoader,利用委派方式加载类,Tomcat定制了自己一系列的ClassLoader来加载类,我自己写
的MyClassLoader继承自Jdk的ClassLoader,Tomcat的WebAppClassLoader继承自URLClassLoader,URLClassLoader又继承自ClassLoader。
查了Apache的Mailing Lists发现有人说Tomcat只能用继承自WebAppClassLoader的ClassLoader
有人遇到过吗?或者看出有什么问题的
1 楼
wupuyuan
2011-09-27
没有尝试过自己的ClassLoad。不过我用过jks,如果不是要加密class,可以用它看看。