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或者systemclassloader来getResource(Stringname),而tomcat默认是先用自己的classloader来getResource.而如果是getResource("/")则app或者systemclassloader会获取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的原理是一样的。

相关推荐