我正在尝试从给定的 WAR 文件中动态提取配置。我的目标是找到所有实现某个接口(Parameter
)的类。
war 文件不在类路径上,所以我创建了一个临时类加载器来检查它的类。
URL webClasses = new URL("jar","","file:" + new File(path).getAbsolutePath() + "!/WEB-INF/classes/");
URLClassLoader cl = URLClassLoader.newInstance(new URL[] { webClasses });
Reflections reflections = new Reflections(ClasspathHelper.forClassLoader(cl), new SubTypesScanner(), cl);
Set<Class<? extends Parameter>> params = reflections.getSubTypesOf(Parameter.class);
这工作正常。Parameter
我在我的 webapp 中找到了所有的实现。
现在,我想对WEB-INF/lib
. 不幸的是,在这种情况下,我还没有找到构建类加载器的方法。类加载器似乎忽略了jar URL ( jar:<url>!/WEB-INF/lib/{entry}.jar
)。
当我运行下面的代码时, Reflections没有找到类:
Set<URL> libs = findLibJars(warUrl));
// The URLs are in the following format : {myWar}.war!/WEB-INF/lib/{myLib}.jar
URLClassLoader cl = URLClassLoader.newInstance(urls.toArray(new URL[urls.size()]));
cl.loadClass("my.company.config.AppParameter");
如果可能的话,我想避免WEB-INF/lib/*.jar
从 WAR 文件中提取并单独分析它们。
我在这里遗漏了什么?(其他方法,创建类加载器的其他方法,......任何线索都会有所帮助)。也许这可以在不使用 Reflections 库的情况下完成?