在Tomcat 7中,我在WEB-INF / lib上有一个漂亮的标准jar文件。在这个jar中,我有一个名为Parser的类,在它旁边(在同一目录下),我还有一个名为AutomaticLocalLoader的类。编译完全没有问题。在运行时,找到了AutomaticLoader类,当它需要Parser类时,我得到了NoClassDefFoundError
解析器和AutomaticLoader类在没有这个问题的情况下已经工作了15年!!在Java和tomact的许多不同版本中;现在突然,我得到了这个NoClassDefFoundError,仅用于解析器类。我已经将副本放在WEB-INF / classes路径内的目录上,仍然出现相同的错误。我已经创建了自己的ClassLoader,以查看是否从我自己从WEB-INF / classes目录加载类时遇到一些错误,但是我可以毫无问题地加载它。
log.info("Leer " + aFlInstructions[i].getAbsolutePath());
LoaderTest A = new LoaderTest();
A.test("com.hds.resolve.model.aguila.AutomaticLocalLoader");
LoaderTest B = new LoaderTest();
B.test("com.hds.resolve.model.aguila.Parser");
if(!bOverrideInputDir)
Psr = new Parser(aFlInstructions[i]);
else
Psr = new Parser(aFlInstructions[i], new String[] { StrLocalDirectory } );
LoaderTest类,尝试使用Class.forName为给定名称创建类对象。如果为NoClassDefFoundError,则尝试使用我自己的类加载器加载类,然后创建该类。 对于AutomaticLoader,它在第一次尝试时成功。对于解析器类,如果失败,则使用自定义类加载器成功加载它。当然,当代码到达“新解析器”部分时,旧的webclassloader仍然会失败并引发NoClassDefFoundError。
解析器和AutomaticLocalLoader都属于同一包,并且存储在WEB-LIB内的同一jar中。
很有趣,该错误确实总是在生产中发生的……但是在我的机器上从来没有。除了进行此调试之外,我不使用海关类加载器。另外,尝试使用旧版本的软件似乎可以修复该错误。不知道为什么。 我想我可以破解一个与tomcat的webclassloader混淆的解决方案,但是我真的更想了解这段代码出了什么问题。