복붙노트

[SPRING] Spring에서 NoClassDefFoundError : ClassInterceptor 클래스가 classpath 내에 존재하지만 throw합니다.

SPRING

Spring에서 NoClassDefFoundError : ClassInterceptor 클래스가 classpath 내에 존재하지만 throw합니다.

Spring MVC와 Hibernate로 간단한, 훈련 애플리케이션을 개발 중이다. 빌드 도구로 Maven을 사용하고 있습니다. 모든 의존성 (스프링, 하이버 네이트, 애착, junit 등)은 Maven의 pom.xml 파일을 사용하여 해결된다.

$ mvn war : war glassfish : deploy가 잘 작동하고, 프로젝트가 GlassFish 서버에 배포되고 모든 * .jar 파일이 복사됩니다 (com.springsource.org.aopalliance-1.0.0.jar 포함).

클래스 패스 내에 불균형이 존재하는지 테스트하는 간단한 서블릿을 만들었습니다.

protected void doGet(...) throws ... {
    response.getWriter().println(org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName());
}

그리고 그것은 존재합니다. 위의 코드는 org.aopalliance.intercept.MethodInterceptor를 예상대로 표시합니다.

그러나 서블릿을 다음과 같이 변경하면 :

protected void doGet(...) throws ... {
    response.getWriter().println(org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName());
}

예외를 throw합니다.

java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

TransactionInterceptor는 불균등 인터페이스를 사용하지만, 내 서블릿이 그것을 할 수있는 동안 나는 그것을 찾을 수없는 이유를 이해하지 못한다. 어떻게 든 클래스 로더와 관련이 있을지 모르지만 나는 그것을 고칠 수있는 방법이 없다는 것을 사과합니다.

세부 정보 :

@Ravi에서 제안한 spring.osgi.core / io에 대한 종속성도 추가했습니다.

<dependency>
    <groupId>org.springframework.osgi</groupId>
    <artifactId>org.springframework.osgi.core</artifactId>
    <version>1.2.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.osgi</groupId>
    <artifactId>org.springframework.osgi.io</artifactId>
    <version>1.2.1</version>
</dependency>

그러나 그것은 문제를 해결하지 못했습니다.

그러나 SpringSource Tool Suite와 함께 제공되는 VMware vFabric tc Server에서 동일한 응용 프로그램을 실행하려고 시도했지만 모든 것이 잘 작동했습니다. 이 문제는 GlassFish 관련 문제 인 것 같습니다.

GlassFish Server Open Source Edition 3.1.1을 사용하고 있습니다.

또 다른 이상한 점은 : Eclipse에서 "Publish"를 사용하여 응용 프로그램을 재배포하면 서블릿이 다음을 throw합니다.

java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

그러나 새로 고침 (브라우저 내에서) 후에 나는 얻는다 :

java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor

추가 새로 고침은 아무 것도 변경하지 않습니다.

해결법

  1. ==============================

    1.부모 클래스 로더의 다른 곳, 불완전한 봄, 아마도 {domaindir} / lib에있을 수 있습니다.

    부모 클래스 로더의 다른 곳, 불완전한 봄, 아마도 {domaindir} / lib에있을 수 있습니다.

  2. ==============================

    2.나는 같은 문제가 있었고 거의 일주일 동안 답변을 사냥 한 후, 당신은 불평이 필요하다는 것을 알았습니다. 병. 이것은 내 문제를 해결했다.

    나는 같은 문제가 있었고 거의 일주일 동안 답변을 사냥 한 후, 당신은 불평이 필요하다는 것을 알았습니다. 병. 이것은 내 문제를 해결했다.

  3. ==============================

    3.클래스 패스에 Spring 트랜잭션 jar를 포함 시켰습니까? TransactionInterceptor.java의 소스는 org.springframework.transaction 및 org.springframework.transaction.support 패키지에 대한 참조를 포함합니다.

    클래스 패스에 Spring 트랜잭션 jar를 포함 시켰습니까? TransactionInterceptor.java의 소스는 org.springframework.transaction 및 org.springframework.transaction.support 패키지에 대한 참조를 포함합니다.

    첫 번째 스 니펫에서 org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName () 당신은 Spring 트랜잭션 라이브러리에 의존성이없는 aopalliance 클래스만을로드하고있다.

    두 번째 스 니펫에서는 TransactionInterceptor 클래스 및 그 종속성을로드하고 있습니다 (org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName ()). 브라우저 새로 고침 후에 나타나는 두 번째 예외는 이전 오류와 비교하여 의미가 있습니다 (브라우저 새로 고침 전)

    첫 번째 스 니펫은 독립적 인 클래스이지만 두 번째 스 니펫은 불투명 한 래퍼 인 Spring 클래스로드입니다. Spring은 자체 종속성 (트랜잭션 관련 클래스 및 불일치 구현)을로드하려고 시도하고 있습니다.

    java.lang.NoClassDefFoundError는 컴파일 타임에 발견되었지만 종속성 중 하나가 런타임에는 발견되지 않을 때 발생합니다 (종속성 문제).

    이러한 종속성을 추가하고 해결되는지 확인하십시오.

  4. from https://stackoverflow.com/questions/9154800/spring-throws-noclassdeffounderror-methodinterceptor-although-class-exists-with by cc-by-sa and MIT license