2011-01-23 66 views
25

我已經遇到過幾次這個問題,只是偶然發現了一個(半)可靠的解決方案,所以我想在這裏發佈它以防萬一任何其他人,或者如果我忘記了它,並且詢問是否有人知道底層原因是什麼以及爲什麼我的修補程序有效。ClassNotFoundException在啓動Tomcat時發送DispatcherServlet(Maven依賴關係未複製到wtpwebapps)

問題 - 我有一個spring 3 webapp,我想使用Eclipse上的Run on Server選項在Tomcat 7服務器上運行。對於一些項目,這只是起作用,但有些似乎進入了一種破碎的狀態,每次服務器啓動時,我都會找到一個沒有找到的類:org.springframework.web.servlet.DispatcherServlet。

經過一番研究,我發現,該項目的Maven依賴沒有被複制到WEB-INF/lib${PROJECT_LOCATION}/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/

我嘗試了很多事情終於注意到,該項目曾在問題面板警告之前:

Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER 
will not be exported or published. Runtime ClassNotFoundExceptions may result. 

也許我應該早點注意到這一點。

無論如何,選擇這個並執行「快速修復」修復了這個問題,我可以愉快地運行我的項目。快速解決方法是:「將關聯的原始類路徑條目標記爲發佈/導出依賴項」。

麻煩是,雖然這個工程,我不知道它是什麼意思。完成後,我無法在項目配置中看到任何明顯的更改。我很想知道實際問題是什麼,如果我能避免它再次發生。我還想知道是否有我自己可以完成的事情(除了執行快速修復),它可以修復它,因爲我覺得我幾乎嘗試了所有其他事情。

感謝您的幫助。

回答

34

查看項目屬性下的「部署程序集」部分。此頁面的內容指定了如何將您的項目組裝到正在運行的應用程序中。尤其是,這是您可以控制您的項目引用的哪些庫應與其打包在一起的地方。選擇Add - > Java Build Path Entries。您將能夠在您的現有構建路徑條目中選擇要包含在程序集中的條目。

你找到的快速修復對你來說也是一樣的。如果您對封面下的內容感到好奇,請在快速修復之前和之後查看您的.classpath文件。快速修復使用一些程序集信息標記類路徑條目。

+0

謝謝!如果我不明白它的作用,我發現不可能記住這些東西,所以這將很有可能在未來爲我節省很多痛苦。 – Russell 2011-01-24 23:13:32

+0

太棒了。在我的Eclipse突然在昨天突然爆炸之後,這真的幫了我很大的忙。 – fforw 2012-03-31 13:08:13

2

檢查.class文件,並與下面替換以下條目

**<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER" />** 

: -

**<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"> 
    <attributes> 
    <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/> 
    </attributes> 
</classpathentry>** 

它爲我工作。