2012-03-22 2 views
1

좋습니다. 3 시간의 투쟁 후, 나는 이것을 해결할 수 없기 때문에 여기서 질문을 게시하기로 결정했다.JSF & Primefaces NoClassDefFoundError

요점을 알아 보겠습니다.

PrimeFaces 3에서 수행 한 NetBeans 웹 프로젝트가 있습니다. 올바르게 작동하지만 아무런 문제가 없습니다.

하지만 웹 프로젝트를 웹 모듈로 사용하여 엔터프라이즈 응용 프로그램을 만들어야합니다.

EJB 파트가있는 EE 프로젝트가 거의 완료되었으므로 두 프로젝트를 병합하기 시작했습니다. 웹 페이지를 Enterprise 프로젝트의 War 파트에 복사하고 Managed Beans를 다시 작성하기 시작했습니다.

하지만 사소한 일로 인해 약간의 변화가있었습니다.

나는 다른 버전 (!이 코드는 하나의 웹 프로젝트에서 작동하는지 염두에두고)에서이 개 파일의 코드를 쓸 것이다 : - JSF 페이지 -

[cut] 
<p:dialog id="loginDialog" header="Login" widgetVar="loginDialog" showEffect="fade" hideEffect="fade" position="center" draggable="false" resizable="false" height="220" width="300" modal="true" showHeader="false"> 
     <h:form id="loginForm"> 
      <br/> 
      Username: <br/><p:inputText id="username" value="#{loginBean.username}" required="true" requiredMessage="random error message"/><br/><br/>       
      Password: <br/><p:password id="password" value="#{loginBean.password}" required="true" requiredMessage="random error message"/><br/><br/>               
      <p:commandButton value="Login" actionListener="#{loginBean.doLogin}" oncomplete="handleLoginRequest(xhr, status, args)" ajax="true" update=":growl, :loginForm, :userPanel"/> <p:commandButton value="Cancel" type="button" onclick="loginDialog.hide()" /> 
     </h:form><br/>      
    </p:dialog> 
[cut] 

을 - - 관리 빈 -

[cut] 
public void doLogin(ActionEvent ae) { 
    user = loginUser.doLogin(username, password); 
    loggedIn = false; 
    FacesMessage msg; 
    RequestContext context = RequestContext.getCurrentInstance(); 
    if (user != null) { 
     msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome " + user.getUsername(), user.getUsername()); 
     loggedIn = true; 
    } else {   
     msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login failed", "Incorrect credentials"); 
    } 
    FacesContext.getCurrentInstance().addMessage(null, msg); 
    context.addCallbackParam("loggedIn", loggedIn); 
} 
[cut] 

이 코드는 전체 EE 응용 프로그램에 "이동"내 웹 프로젝트에서 작동 오류로 날 리드하더라도 :

The class 'ManagedBeans.LoginBean' does not have the property 'doLogin'.

따라서 문제는 doLogin의 서명 (하나의 매개 변수를 사용하지만 JSF 페이지에서는이 매개 변수없이 호출 됨)이 원인이며, 이것이 구성 요소가 PrimeFaces 문서에서 사용되는 방식 임에도 불구하고 나는 단순히으로 변경했습니다 : - JSF 페이지 -

[cut] 
<p:dialog id="loginDialog" header="Login" widgetVar="loginDialog" showEffect="fade" hideEffect="fade" position="center" draggable="false" resizable="false" height="220" width="300" modal="true" showHeader="false"> 
     <h:form id="loginForm"> 
      <br/> 
      Username: <br/><p:inputText id="username" value="#{loginBean.username}" required="true" requiredMessage="random error message"/><br/><br/>       
      Password: <br/><p:password id="password" value="#{loginBean.password}" required="true" requiredMessage="random error message"/><br/><br/>               
      <p:commandButton value="Login" action="#{loginBean.doLogin()}" oncomplete="handleLoginRequest(xhr, status, args)" ajax="true" update=":growl, :loginForm, :userPanel"/> <p:commandButton value="Cancel" type="button" onclick="loginDialog.hide()" /> 
     </h:form><br/>      
    </p:dialog> 
[cut] 

- 관리 빈 -

[cut] 
public void doLogin() { 
    user = loginUser.doLogin(username, password); 
    loggedIn = false; 
    FacesMessage msg; 
    RequestContext context = RequestContext.getCurrentInstance();   
[cut] 

그래서 메소드 서명과 commandButton의 동작을 변경했습니다. 이 변경을 수행함으로써

,

java.lang.NoClassDefFoundError: org/primefaces/context/RequestContext

예, 지금이 하나있어 .. 이전 오류가 gone..but 것 같다.

라이브러리를 가져 오면 모든 것이 정상입니다. NetBeans는 org.primefaces. *에서 올바르게 가져올 수 있습니다. 따라서 jar 파일 il이로드 된 것으로 가정합니다.

하지만 이상한 점이 있습니다.

라이브러리에서 PrimeFaces를 제거하고 새로운 Jar 파일 (이전과 같은 파일, 다른 디렉토리에 있음)을 가져온 후에 작동합니다.

페이지가 문제없이로드되었습니다.

하지만 새로운 배포로 인해 이전과 동일한 NoDefClassFoundError가 발생하기 때문에 다음 배포까지 지속됩니다.

라이브러리 경로를 사용하여 일부 게임을 마친 후에 해결 되었기 때문에 상당히 무작위이지만 둘 이상의 배포에서는 작동하지 않습니다.

나는 무엇이 해야할지 모르겠다. 상황이 꽤 이상하기 때문이다.

가끔 http://primefaces.org/ui 네임 스페이스 (또는 이와 비슷한 형식)의 라이브러리를 찾을 수 없다는 노란색 경고가있는 페이지가로드됩니다.

질문의 길이는 유감이지만, 내가 보는 것을 설명하기가 어렵습니다.

나를 해결책으로 지적 할 수있는 사람이 있습니까?

답변

6

두 문제 모두 정확히 같은 원인이 있습니다. PrimeFaces JAR 파일은 런타임 클래스 경로에 없습니다 (간단히 말해서 PrimeFaces 3.x를 사용 중이며 taglib URI를 변경하지 않았다고 가정합니다).

The class 'ManagedBeans.LoginBean' does not have the property 'doLogin'.

첫 번째 예외가 인정 하듯이 다소 오해의 소지가 있지만, 실제로는 PrimeFaces 구성 요소는 전혀 Facelets에 의해 해결되지 않고 일반 텍스트/HTML로 처리 하였다. PrimeFaces 구성 요소 마크 업에서 인라인 된 EL 표현식은 값 표현식으로 해석됩니다. 마치 <p>#{loginBean.doLogin}</p>과 같은 템플릿 텍스트에 EL plain을 쓰는 것과 같습니다. 결과를 인쇄하려면 getDoLogin() 메소드를 찾으십시오.

java.lang.NoClassDefFoundError: org/primefaces/context/RequestContext

두 번째 예외는 가까운 문제의 실제 설명하는 방법을 제공합니다 : 언급 된 클래스를 포함하는 JAR 파일은 웹 애플리케이션의 런타임 클래스 경로에 있지 않습니다.

PrimeFaces JAR 파일이 deploy의 webapp의 /WEB-INF/lib 폴더에 있는지 확인하십시오.

+0

이제는 제대로 작동하기 때문에 확실 하긴하지만 WEB-INF/lib 디렉토리를 사용하지 않고도 전나무 웹 프로젝트가 작동하게 된 이유는 무엇입니까? – StepTNT

+1

Netbeans를 사용하지 않지만 프로젝트의 폴더를 보지 말아야합니다. Netbeans이 숨기거나 변경하지만 배포시 폴더를 확인해야합니다. 그것이 모두 런타임에 중요합니다. WAR/EAR로 내보내 자신을보십시오. – BalusC