在struts2中,有一个组件为classFinder,它可以在整个项目中查找任意一个指定条件的类。如查找实现了某一个接口的所有实现类,或者查找有指定注解的所有类。这个组件的好处自不用说,但是在jboss7环境下,即会出现查找不到对象的问题。
如以下的条件就不能查找任何信息:只查找以com.iflym包名开头的满足指定条件的类。那么,这个classFinder的构建方法就是:
public ClassFinder(ClassLoaderInterface classLoader, String... dirNames) { this(classLoader, getURLs(classLoader, dirNames)); }
这个方法,会按照指定的包名,组装多个url地址,那么在jboss7中,就会组装成以下的一个地址:
jboss/standalone/tmp/vfs/deplymentxxx/iflym.jar-xxx/contents/com/iflym
那么,在这个目录下,肯定没有任何东西。那么xword在实现jboss vfs的查找时,会使用以下方法进行定位:
if (s.startsWith("class org.jboss.vfs.VirtualFile")) { // JBoss 7 and probably JBoss 6 File physicalFile = readJBossPhysicalFile(content); return physicalFile.toURI().toURL(); private static File readJBossPhysicalFile(Object content) throws Exception { Method method = content.getClass().getDeclaredMethod("getPhysicalFile"); return (File) method.invoke(content); }
这样就会返回以上的文件目录的一个url对象,而实现上,这个url对象下面没有任何class文件,自然就不会返回任何信息。
以上的问题,只存在于我们要查找的类在一个jar中的情况,如果在classes目录下,是没有问题的。
解决这个问题,我们需要使用另一个组件:reflections。官方地下:http://code.google.com/p/reflections/
继续阅读“xwork classFinder在jboss 7环境不能正确处理url resource的问题以及解决方法”