2011-05-12 5 views
7

Im '이 코드는 VMWare 서버 내부의 sun/oracle JVM 1.6_23 인 Linux Red Hat에서 실행됩니다.java.lang.NoClassDefFoundError : 익명의 내부 클래스

몇 시간이 지나면 JVM이 익명의 내부 클래스에 액세스 할 수없는 것처럼 보입니다.

일정 기간 동안 작동하므로 내 클래스 경로가 정상입니다.

내가 가진 모든이 같은 오류입니다 :

java.lang.NoClassDefFoundError : com/mycompany/impl/MyClassImpl$1 at com.mycompany.impl.MyClassImpl.markAsDeletable (MyClassImpl.java :45).

라인 (45), 그것은 나의 새로운 술어

 DomaineVO domaineVO = Iterables.find(domainesVO, new Predicate<DomaineVO>() { 

      @Override 
      public boolean apply(DomaineVO input) { 
       return input.getId().equals(domaine.getIdentifier().toString()); 
      } 
     }); 

모든 아이디어를 찾을 수 아래의 첫 번째 줄을 무엇입니까?

+0

정말 클래스 경로의 폴더 (또는 JAR 파일 내) 중 하나에 존재하는'MyClassImpl $ 1.class' 파일을합니까? –

+0

예, 파일이 있습니다. 내가 말했듯이, 코드는 한동안 작동하고 작동을 멈 춥니 다. – oneeyejack

답변

4

마지막으로, 우리가 문제에 손가락을 대고 있다고 생각합니다.

이 코드는 jetty에서 실행되며 .war 파일의 자동 배포를 사용합니다. 기본적으로 jetty는 java.io.tmpdir을 사용하여 .war 파일을 배포합니다.

우리의 문제는 리눅스에서만 발생했으며 대부분 이른 아침 (사무원이 앱을 사용하자마자) 이른 아침이었습니다.

원인은 밤에/tmp를 정리하는 것이 었습니다 (우리 서버의 LOGROTATE 명령으로 수행).

규칙 :/tmp를 너무 오랫동안 사용하지 말고 jetty 배포 전쟁을 자신의 디렉토리에 만드십시오.

모두에게 감사

+0

Eclipse Terminal 플러그인에서 동일한 문제가 발생했습니다. 나는 리눅스 터미널로 전환했고 해결되었다. – thSoft

2

JVM이 익명 클래스의 클래스 파일을 찾을 수없는 것 같습니다. 이 이름은 'MyClassImpl $ 1.class'로 지정됩니다. 클래스 경로에없는 경우에는 삭제해야합니다. 존재하는 경우 JVM에 문제가 있습니다.

+0

JVM에 문제가있는 것 같지만, 무엇을 배울 수 있기를 바랍니다. (내가 말했듯이, 다른 코멘트에서 파일은 거기에있다.), 나는 내가 미친 상황에 있다는 것을 압니다. – oneeyejack

+0

@oneeyejack : 파일이있을 경우 또 다른 가능성은 JVM이 더 이상 액세스 할 수 없도록 액세스 권한이 변경된 것입니다. –

+0

모든 것이 .war 파일 안에 있습니다. 다른 모든 것이 실행 중이면 사용 권한 문제와 관련이 없어야합니다. Nick Fortescue는 GC 관련 문제의 가능성에 대해 이야기했습니다. 무슨 일이 일어나고 있는지 더 잘 볼 수있는 적절한 -XX 옵션을 찾으려고합니다. – oneeyejack

1

매우 이상하게 들립니다. 첫째, 코드가 한동안 작동하면, 말한 것처럼 파일이 있어야합니다. 둘째, JVM이 사용 된 클래스를 메모리에서 언로드하는 경우는 거의 없습니다. 일부 JVM은 메모리가 부족한 상황이나 GC의 일부로 수행하지만 일부 최적화에서는 일반적으로이를 사용합니다.

필자는 ClassLoaders가 변경되는 상황에서 JVM을 사용하고 있다고 생각합니다. Netbeans (특히)를 사용하고 있지만 이클립스라고 생각하면 코드를 부분적으로 다시 컴파일하면 클래스 로더가 일치하지 않을 수 있습니다. IDE에서 실행됩니까?

다른 대안은 ClassLoader를 변경하는 것입니다. 실행중인 웹 서버 또는 응용 프로그램 서버로 다시 릴리스하면 이전 클래스에는 새 인스턴스에 맞는 클래스 로더가 없습니다. ClassLoader는 파일이 있더라도 이전 버전을 찾지 못할 수도 있습니다. 응용 프로그램/웹 서버에 다시 배포 하시겠습니까?

마지막으로 직렬화에서 가능할 수도 있습니다. 클래스가 Serializable이고 serialVersionUID가 일치하지 않으면이 문제가 발생할 수 있습니다. 여기에 객체 직렬화를하고 있습니까?

+0

부두가 설치된 서버에서 문제가 발생하며 어떤 종류의 핫 배포 기능도 사용하지 않습니다. 클래스는 Serializable이 아닙니다. JVM에 PermGenSpace와 비슷한 종류의 문제가있을 수 있습니까? – oneeyejack

+0

부두 클래스 경로에 항아리 나 디렉토리를 추가하는 데 사용하는 방법은 무엇입니까? 그들은 항아리 나 디렉토리로 추가되고 있습니까? http://docs.codehaus.org/display/JETTY/Classloading –

+0

모든 코드는 .war 파일 안에 포함되어 있으므로 war 경로를 다음과 같이 설정합니다. WebAppContext jettyWebAppContext = new WebAppContext(); \t \t jettyWebAppContext.setWar (war); \t \t jettyWebAppContext.setContextPath (normalizedContext); jettyServer.addHandler (jettyWebAppContext); – oneeyejack

관련 문제