2013-05-07 92 views
1

我想在使用Spring Rest的基於Spring的多模塊項目中開發一個RESTful API。爲此,我有一個Web應用程序模塊和一些其他業務/數據層模塊。例如,這將是我的簡化項目結構:Spring Rest Controllers:部署到Tomcat

myProject 
    -- webapp (war-packaged) 
    -- business (jar-packaged) 
    -- data (jar-packaged) 

業務模塊依賴數據模塊上也是如此業務模塊上的web應用。 Webapp成功導入每個模塊的應用程序上下文。現在我希望能夠使用一些業務模塊類,根據從數據庫檢索到的某些數據進行某種計算,以提供某種資源。我看過的所有例子都非常簡單,而且這種多模塊方法根本沒有涉及。

問題是什麼?就我而言,Tomcat以特定順序加載類。具體來說,它首先加載WEB-INF /類,然後才加載WEB-INF/lib(所有webapp依賴項都放置在這種情況下的業務模塊)。所以,我的問題出現了。 我應該在哪裏放置我的控制器類?如果我將它們放在webapp模塊中,我將無法自動裝載任何業務模塊bean,因爲當我部署webapp war(至少這是我所經歷的行爲)時,Tomcat將拋出ClassNotFoundException

答案可能很簡單,但對於Spring及其世界來說我相當陌生!

謝謝大家提前。

回答

0

您的業務和數據罐將進入WEB-INF/lib目錄。然後,當您部署它時,這些罐子將自動添加到您的應用的CLASSPATH中。您將需要將您的應用程序部署爲WAR文件。理想情況下,您將構建業務和數據JAR,將它們添加到某個存儲庫,然後構建系統會將每個jar的正確版本提取到您的WEB-INF/lib目錄中。

至於最初的問題,控制器類進入webapp/src目錄。

+0

我遵循你的方法@Atrawraw17,但是如果我嘗試在控制器類中導入任何類的業務模塊,那麼當我部署戰爭時,Tomcat會引發前面提到的錯誤。這些導入在我的IDE中不顯示任何錯誤。我已經檢查了依賴jar的內容,並且類在那裏,所以我找到的唯一解釋是在Tomcat環境中的類加載順序,例如,在這裏:http://avricot.com/blog/index.php? post/2011/02/18/tomcat-class-loader%2C-priority-order,首先加載第一個WEB-INF/classes(例如:controllers),然後纔是WEB-INF/lib。 – jarandaf 2013-05-07 21:49:29

+0

您確定業務模塊jar位於WEB-INF/lib目錄中嗎?你確定你引用的業務模塊的類是在業務模塊jar嗎? – Athrawn17 2013-05-08 15:19:56

0

假設您使用的是Maven 2.確保您的程序集創建者(例如maven war module)將最終的.war文件的WEB-INF/lib目錄中的依賴.jar文件包含進來。這應該是默認程序(每個:http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#dependentWarIncludes)。另一個問題是你的子項目(業務和數據)是否甚至創建了jar,以便它們可以包含在WAR輸出中。

如果您對該war文件的內容有疑問,請通過從命令行執行 'jar tvf $ WAR_FILENAME'並觀察WEB-INF/lib目錄內容來瀏覽其列表。你應該在那裏看到你的業務和數據罐。進一步通過爆炸你的戰爭文件,然後瀏覽業務和數據jar的內容(使用'jar xvf $ FILENAME'在新目錄中爆炸)。

希望這會有所幫助!

+0

您是否對其他構建工具有深入瞭解,比如grable?我是否需要將正確的依賴項添加到我的構建文件中? – Erik 2013-11-06 04:37:48