2009-08-23 57 views
1

我的控制器(抽象控制器)正在調用服務類來獲取URL。在我服務的I類實例化我的依賴性在構造函數中:春天看不到我導入的類

抽象控制器:

public class MyPageController extends AbstractController{ 
private UserService userService; 
private LearnerService learnerService; 
private TwitterService twitterService; 
@Override 
protected ModelAndView handleRequestInternal(HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 
    userService = UserServiceFactory.getUserService(); 
    learnerService = new LearnerService(); 
    twitterService=new TwitterService(); 

服務類:

public TwitterService(){ 
    // 
    twitter = new Twitter(); 
} 

但是當我嘗試運行我的Web應用程序,春天拋出出現以下錯誤:

nested exception is java.lang.NoClassDefFoundError: twitter4j/Twitter: 
    java.lang.NoClassDefFoundError: twitter4j/Twitter 
    at com.hardwire.service.TwitterService.<init>(Twitter Service.java:21) 
    at com.hardwire.controller. 
    MyPageController.handleReq uestInternal(MyPageController.java:30) 

爲什麼會拋出此錯誤?我不明白。我在使用它的服務類中導入了Twitter類。

回答

1

如果ClassLoader實例嘗試加載類的定義並且未找到該類的定義,則會得到NoClassDefFoundError。

這基本上意味着在運行時在類路徑中找不到該類。在代碼中有一個導入聲明是必需的,但不足以使其工作,您還需要確保包含twitterj.Twitter的jar在應用程序類路徑中。

最簡單的方法是將jar複製到應用程序的WEB-INF/lib文件夾中。或者使用工具(如Maven,Ivy,Ant或甚至像Eclipse這樣的IDE)來確保將所需的罐子打包到您的戰爭中。

+0

感謝您的回覆。我已將庫複製到web-inf/lib文件夾中。現在它工作了! 這改變了我過去的一些假設。我認爲只要有一個導入聲明就可以了。原來,開發和生產環境有不同的類路徑! (我得到的是否正確?) – Jeune 2009-08-23 15:08:09

+0

是的,任何給定環境的類路徑可以有多種不同的原因。 Java webapp可以訪問WEB-INF/lib的內容,任何其他的classpath元素都可能會改變 – 2009-08-23 18:58:05

0

你的WEB-INF/lib目錄中有twitter4j jar嗎?