Java 为什么要为lib文件夹中jar中的类找到NoClassDef?

Java 为什么要为lib文件夹中jar中的类找到NoClassDef?,java,Java,使用Tomcat7,我通过urlClassLoader加载了一个Jasper类,当我调用构造函数时,我得到一个可丢弃的NoClassDefFoundError,抱怨它找不到应该在项目WEB-INF/lib中找到的apache/poi类,因为poi jar在该文件夹中 为什么它不能从tomcat lib文件夹自动搜索和加载类 Class<?> JRXlsExporter = urlClassLoader.loadClass("net.sf.jasperreports.engi

使用Tomcat7,我通过urlClassLoader加载了一个Jasper类,当我调用构造函数时,我得到一个可丢弃的NoClassDefFoundError,抱怨它找不到应该在项目WEB-INF/lib中找到的apache/poi类,因为poi jar在该文件夹中

为什么它不能从tomcat lib文件夹自动搜索和加载类

Class<?> JRXlsExporter = urlClassLoader.loadClass("net.sf.jasperreports.engine.export.JRXlsExporter");
Constructor constructor = JRXlsExporter.getConstructor();        // throws  java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Sheet
Class JRXlsExporter=urlClassLoader.loadClass(“net.sf.jasperreports.engine.export.JRXlsExporter”);
构造函数=JRXlsExporter.getConstructor();//抛出java.lang.NoClassDefFoundError:org/apache/poi/ss/usermodel/Sheet

apache poi-jar的确切添加位置是哪里?Jasper-jar是否也在
WEB-INF/lib
文件夹中?是的,Jasper-jar也在WEB-INF/lib中,并且那里的构造函数也在同一文件夹中依赖于poi-jar。我用类加载器加载这个jar的原因是,这似乎是保证我将加载这个版本的jasper jar的唯一方法,因为tomcat lib文件夹中有一个旧版本,我不能仅仅凭猜测就删除它,但请尝试使用选项并用jasper jar的路径替换
path
。如果您无法修改用于启动Tomcat的命令,那么可以尝试使用环境变量。@Abra这些选项将影响使用该Tomcat实例的所有项目,不幸的是,我只能更改此项目的配置选项,因为其他项目(使用同一Tomcat实例)依赖于旧的jasper JAR,我希望找到一个配置解决方案,而不是通过类加载器加载类的代码