我已經花了幾個小時試圖找出原因,我已經得到了java.lang.NoClassDefFoundError
,我已經縮小的原因到Tomcat的classpath。Tomcat的CLASSPATH與Java不同,它不包含「。」我該如何改變它?
我用下面的代碼,看看有什麼路徑變量持有:
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") + "'");
,輸出爲:「」
Classpath: ':/usr/local/tomcat/bin/bootstrap.jar' Ext dirs: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ext:/usr/java/packages/lib/ext' Library path: '/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' Path separator: ':'
正如你可以看到,類路徑不啓動因爲它應該是這樣的,我相信這就是爲什麼我的程序無法找到從Web應用程序中的子目錄導入的類。
要查看類路徑設置,我也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
添加到ClassName.java
的開頭,然後使用someServlet.java
中的import packagename.*
將其導入。
EDIT2:我已經解決了我的問題。我的主要問題是,如下所述,不使用正確的軟件包名稱。另外,我試圖從classes/controllers/
目錄內編譯,而不是從classes/
編譯。感謝大家的幫助!在Web應用程序所需的
我所有的servlet都在WEB-INF/classes/controllers中,而我試圖加載的類是子目錄中的* .class文件。 我的問題是,因爲「。」似乎沒有在我的Web應用程序的類路徑中,從子目錄加載庫不起作用。 –
位於WEB-INF/classes/controllers/packagename/ClassName.class中的類文件的正確包將是「controllers.packagename」,而不是「包名」,因爲您的問題似乎暗示了這一點。您不能在WEB-INF/classes下將其他子目錄作爲類路徑根,並且系統屬性或環境變量位於未由類加載器評估的Web應用程序中,因爲它們位於獨立應用程序中。 – jarnbjo
。可能會引用tomcat的啓動腳本,而不是webapp。 – nos