Test.class.getResource("/").toString在tomcat和apusic表现不一致的问题

    从tomcat上将web应用移植到apusic应用服务器可能会出现以下问题:
应用中如果有代码Test.class.getResource("/").toString,则在tomcat下得到的是%tomcat_home%/webapps/your_web_app/WEB-INF/classes/,而在apusic下得到的是DOMAIN_HOME(类似C:\Apusic-6.0\domains\mydomain)。

    产生这个问题的原因是在apusic源码中默认是先用app或者system classloader来getResource(String name),而tomcat默认是先用自己的classloader来getResource.而如果是getResource("/")则app或者system classloader会获取DOMAIN_HOME这个结果。

    所以解决此兼容性问题的方法有三种:
1、修改Test.class.getResource("/").toString中"/"为"//",这样父classloader就无法找到DOMAIN_HOME,而返回子classloader获取的路径。
2、在配置文件vm.options中添加参数apusic.prefer.war.classes=true,使apusic先使用自己的classloader来getResource。
3、Test.class.getResource("/").toString,改成Test.class.getClassLoader().getResource("/").toString 也可以解决问题。

    以上三种方法都可以获取DOMAIN_HOME/application/WEB-INF/classes/路径,其中方法3跟方法2的原理是一样的。

猜你喜欢

转载自zydky.iteye.com/blog/553925