我一直在花费数小时试图弄清楚为什么我得到了java.lang.NoClassDefFoundError
.,并且我已经将原因缩小到 Tomcat 的类路径。
我使用下面的代码来查看路径变量包含什么:
out.println("Classpath: '" + System.getProperty( "java.class.path" ) + "'" );
out.println("Ext dirs: '" + System.getProperty( "java.ext.dirs" ) + "'" );
out.println("Library path: '" + System.getProperty( "java.library.path" ) + "'" );
out.println("Path separator: '" + System.getProperty( "path.separator" ) + "'" );
输出是:
类路径:':/usr/local/tomcat/bin/bootstrap.jar' 分机目录:'/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ext:/usr/java/packages/lib/ext' 库路径:'/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386/server:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ i386:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib' 路径分隔符:':'
如您所见,Classpath 不以“.”开头。正如它应该的那样,我相信这就是为什么我的程序找不到我从 webapp 的子目录中导入的类的原因。
要查看类路径的设置位置,我做了grep -R bootstrap.jar /usr/local/tomcat/
,并且遇到了这个:(CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar
在文件中/usr/local/tomcat/bin/catalina.sh
)
这让我相信由于某种原因 $CLASSPATH 在这里是空的。但是,echo $CLASSPATH
成功返回.:/usr/lib/jvm/java-6-sun/bin:/usr/local/tomcat/lib/servlet-api.jar
任何人都可以帮助解决这里的问题吗?
编辑:我所有的 servlet 文件都在WEB-INF/classes/controllers/
,我试图加载的库是子目录中的类文件。例如,如果ClassName.class
在 WEB-INF/classes/controllers/packagename/ 目录中,我添加package packagename
到 的开头,然后使用inClassName.java
导入它。import packagename.*
someServlet.java
EDIT2:我已经解决了我的问题。我的主要问题是,如下所述,没有使用正确的包名称。另外,我试图从classes/controllers/
目录内部编译,而不是从classes/
. 谢谢大家的帮助!