2013-12-12 33 views
0

我的web應用程序運行tomcat 7,myfaces,primefaces。Tomcat 7無法找到我的類拋出javax.el.E​​LException:java.lang.NoClassDefFoundError

我的生產m/c存在問題,即使精確的代碼和庫在兩臺機器上都加載,但我無法在開發環境中進行復制。唯一的區別是tomcat的顛覆,開發了tomcat7.0.35,並督促有tomcat7.0.40

javax.servlet.ServletException: javax.el.ELException: java.lang.NoClassDefFoundError: Could not initialize class com.myapps.util.UIStringUtil 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:229) 
com.myapps.util.LoginFilter.doFilter(LoginFilter.java:56) **root cause** java.lang.NoClassDefFoundError: Could not initialize class com.myapps.util.UIStringUtil 
com.myapps.bean.UserAuthBean.login(UserAuthBean.java:106) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.apache.el.parser.AstValue.invoke(AstValue.java:278) 
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 
org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:96) 
org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:68) 
javax.faces.component.UICommand.broadcast(UICommand.java:120) 
javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:1028) 
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:286) 
javax.faces.component.UIViewRoot._process(UIViewRoot.java:1375) 
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752) 
org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:38) 
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170) 
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:197) 
com.myapps.util.LoginFilter.doFilter(LoginFilter.java:56) 

我不知道爲什麼會這樣。我很好奇爲什麼這是作爲javax.el.E​​lexception引發的,這是從java bean代碼中拋出的。在哪裏發生這種情況的準確代碼行(UserAuthBean.java:106)

context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
        UIStringUtil.getUIString("msgKey"), 
        UIStringUtil.getUIString("msgKey"))); 

UIStringUtil類有幫助從資源包中讀取數據的靜態變量和方法。

正如我前面提到的,這隻發生在生產箱上,我們無法在開發箱上重現它。

請在這裏提供一些幫助。

+0

你是如何部署我想知道的應用程序和庫。我的蜘蛛感官告訴我,這裏正在發生類加載衝突,但是無法訪問機器,這將永遠只是一種直覺。 – Gimby

+0

剛剛想出了一個解決方案,但仍然不知道爲什麼問題出現在第一位。在UIStringUtil類中,我替換了私有靜態ResourceBundle appmsgbundle = FacesContext.getCurrentInstance()。getApplication()。getResourceBundle(FacesContext.getCurrentInstance(),「appmessages」);與私有靜態ResourceBundle appmsgbundle = ResourceBundle.getBundle(「com.myapps.util.appmessages」);這解決了這個問題。看起來,由於某種原因,FacexContext的啓動遇到了問題。但不知道爲什麼。 –

回答

1

它被拋出爲ELException,因爲它在執行一些EL表達式時發生。

您應該查看異常的根本原因,以瞭解異常的根本原因。再往下查看堆棧跟蹤,找出根本原因。首先是已經存在於您發佈的不完整的堆棧跟蹤:

java.lang.NoClassDefFoundError: Could not initialize class com.myapps.util.UIStringUtil 

這基本上意味着,類裝載由Java的封面下做如下

Class.forName("com.myapps.util.UIStringUtil"); 

已經失敗,一個例外。如果您絕對肯定該類存在於運行時類路徑中,那麼這隻能意味着該類的任何靜態變量或初始化塊都會引發異常。加載一個類即初始化所有靜態變量並執行所有的靜態初始化塊(haven't you ever wondered how those JDBC drivers work?)。

異常應該反過來在java.lang.NoClassDefFoundError原因之後在堆棧跟蹤中最底層的根本原因可見。也許是一個相當自我解釋的java.lang.NullPointerException

+0

..確實如我在上述問題的評論中發佈的那樣,我發現FacesContext的ResourceBundle初始化導致了這個問題。但我仍然不確定爲什麼這會在生產盒上出現問題,而不是在開發盒上。另外,正如我上面所述,當我將FacesContext從圖片中初始化ResourceBundle時,一切似乎都可以正常工作。在這一點上,我有一個修復,但仍然不明白是什麼造成了這個問題。 –

+0

'FacesContext'僅在觸發'FacesServlet'的HTTP請求期間可用(顯然,因爲它是負責將'FacesContext'創建爲本地線程的負責人)。一個任意類不一定在觸發'FacesServlet'的HTTP請求期間加載。它也可以在那裏加載,例如,應用程序啓動期間因此,在加載一個類的過程中'FacesContext'可用的假設是非常錯誤的。 – BalusC

+0

這肯定是在HTTP請求週期中完成的,所以FacesContext可用。 –

相關問題