2009-10-23 31 views
3

我已經花了幾個小時試圖找出原因,我已經得到了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應用程序所需的

回答

7

類應該位於WEB-INF/classes文件夾中的Web應用程序中或裝在位於WEB-INF/lib中的JAR文件。您通常不應該像這樣嘗試使用servlet容器的通用類路徑設置。

+0

我所有的servlet都在WEB-INF/classes/controllers中,而我試圖加載的類是子目錄中的* .class文件。 我的問題是,因爲「。」似乎沒有在我的Web應用程序的類路徑中,從子目錄加載庫不起作用。 –

+2

位於WEB-INF/classes/controllers/packagename/ClassName.class中的類文件的正確包將是「controllers.packagename」,而不是「包名」,因爲您的問題似乎暗示了這一點。您不能在WEB-INF/classes下將其他子目錄作爲類路徑根,並且系統屬性或環境變量位於未由類加載器評估的Web應用程序中,因爲它們位於獨立應用程序中。 – jarnbjo

+1

。可能會引用tomcat的啓動腳本,而不是webapp。 – nos

7

Tomcat的類路徑是不應該與.首發。實際上,在類路徑中添加.只是一種方便的方法,可以讓java在當前目錄中查找類,而不必在命令行上使用-cp

實際上,在大多數情況下,您不必調整Tomcat的類路徑。爲了讓Tomcat能夠找到你的類,你需要做的是將你的應用程序部署爲一個具有特定佈局的標準WAR(網絡存檔)。類似的東西:

. 
|-- WEB-INF 
| |-- classes 
| | `-- com 
| |  `-- mycompany 
| |   `-- MyServlet.class 
| |-- lib 
| | |-- bar.jar 
| | `-- foo.jar 
| `-- web.xml 
|-- application.jsp 
|-- image.gif 
`-- index.html 

WEB-INF/classes目錄是編譯後的類必須,這就是Tomcat將尋找他們。如果您將課程放在WEB-INF/classes/controllers中,controllers將被視爲包名稱的一部分(這可能不是您想要的)。所以,你有兩個選擇:

  1. 刪除controllers目錄
  2. 或添加到包名。

但它們是相互排斥的,你不能同時擁有。

2

CLASSPATH不是「應該」以"."開頭。由於其目的是配置運行時,所以可以自由選擇任何值。還要注意,自從Java 1.1(1997年初發布)—至少12年以來,使用CLASSPATH環境變量已被阻止。

另一方面,Web應用程序的類路徑是很好的規定。將controllers目錄(和任何其他無效的子目錄)的內容移動到WEB-INF/classes/,以便軟件包目錄是classes的直接子目錄。

相關問題