2013-12-12 2 views
0

내 웹 응용 프로그램은 tomcat 7, myfaces, primefaces를 실행합니다.Tomcat 7에서 내 클래스를 찾을 수 없습니다. javax.el.ELException : java.lang.NoClassDefFoundError

내 컴퓨터에서 정확한 코드와 라이브러리가 두 시스템에 모두로드되어 있어도 개발 환경에서 복제 할 수 없다는 문제가 있습니다. 유일한 차이점은 DEV는 tomcat7.0.35 및 자극 내가 이런 일이 왜 확실하지 않다

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) 

tomcat7.0.40 있음, 톰캣 전복이다. 왜 이것이 javax.el.Elexception으로 던져 졌는지 궁금합니다. 자바 빈 코드에서 던져진 곳이 어디입니까? 이런 일이 코드의 정확한 라인은 (UserAuthBean.java:106)

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

UIStringUtil 클래스 리소스 번들에서 데이터를 읽는 데 도움 정적 변수 및 방법이있다.

앞에서 언급했듯이 이는 제작 상자에서만 발생하며 개발 상자에서 재현 할 수 없습니다.

여기에 도움을주세요.

+0

어째서 궁금한 응용 프로그램과 라이브러리를 배포하고 있습니까? 내 거미 감각은 클래스 로더 충돌이 여기에 있지만, 기계에 접근하지 않고도 항상 직감을 유지할 수 있다고 말합니다. – Gimby

+0

해결책을 찾아 냈지만 문제가 왜 처음인지 알 수 없습니다. UIStringUtil 클래스에서 private static ResourceBundle을 대체했습니다. appmsgbundle = FacesContext.getCurrentInstance(). getApplication(). getResourceBundle (FacesContext.getCurrentInstance(), "appmessages"); 개인 정적 ResourceBundle 사용 appmsgbundle = ResourceBundle.getBundle ("com.myapps.util.appmessages"); 그리고 그 문제가 해결되었습니다. 어떤 이유로 FacexContext 초기화에 문제가있는 것 같습니다. 그러나 이유를 모릅니다. –

답변

1

일부 EL 표현식을 실행하는 동안 발생했기 때문에 ELException으로 표시됩니다.

예외의 근본 원인에 대해 알아 보려면 예외의 근본 원인을 확인해야합니다. 스택 추적을 더 내려보고 근본 원인을 찾으십시오. 첫 번째는 이미 게시 된 불완전 스택 트레이스에 존재 :

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

이 기본적으로

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

예외로 실패 다음과 같이 클래스의 로딩하는 것은 내부적으로 자바에 의해 수행으로 있다는 것을 의미한다. 클래스가 런타임 클래스 경로에 있다고 절대적으로 긍정적이면 클래스의 정적 변수 또는 초기화 프로그램 블록 중 하나에서 예외가 발생했다는 것을 의미 할 수 있습니다. 클래스를로드하면 모든 정적 변수가 초기화되고 모든 정적 initilaizer 블록 ( 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를 사용할 수 있습니다. –

관련 문제