2011-05-09 4 views
3

Java 서블릿을 사용하는 WebSphere 6.1 용 애플리케이션을 개발 중입니다. 내 서블릿 내에서 직렬 베슬션 ID를 1L로 정의했습니다. 배포 및 내 응용 프로그램을 실행하면, 나는 (서버 로그에서) 다음과 같은 유형의 LinkageError가 수신 오전 :Java LinkageError 예외는 어떻게 수정합니까?

[5/9/11 15:14:26:868 EDT] 0000001c WebApp   
E [Servlet Error]-[ManageRecordsConsumerServlet]: java.lang.Exception: 
java.lang.LinkageError: LinkageError while defining class: 
<redacted>.docindexupdate.batch.servlet.ManageRecordsConsumerServlet 
Could not be defined due to: (<redacted>/docindexupdate/batch/servlet 
/ManageRecordsConsumerServlet) class name must be a string at offset=2074 
This is often caused by having a class defined at multiple 
locations within the classloader hierarchy. Other potential causes 
include compiling against an older or newer version of the class 
that has an incompatible method signature. 

나는 문제가 무엇인지 확실하지 않다. 이전에 직렬 버전 uid를 정의하기 전에 이것을보고 있었고이를 정의하고 일관성있게 유지함으로써 클래스 파일에 대한 향후 업데이트가 성공적으로 실행될 것이라고 생각했습니다. 컴파일 또는 서버 배포 중 오류가 없습니다. 이전 버전의 서블릿이 WebSphere 인스턴스의 어딘가에 캐시 될 수 있습니까? (현재 개발자 머신에만 배포하고 있습니다)?

class name must be a string at offset=2074 

라인

도 복잡하다.

답변

5

두 개의 다른 클래스 로더에로드되는 jar 파일이있을 것으로 예상됩니다. 즉, 시작시 websphere 서버가 해당 jar를로드하거나 해당 jar가있는 디렉토리를 승인했다는 의미입니다. 또한 배포하려는 EAR에는 lib에 jar 파일이 있습니다. 둘은 런타임에 충돌 할 수 있습니다.

내가 제안하는 것은 ManageRecordsConsumerServlet이 속한 JAR 파일을 찾고 EAR 라이브러리 또는 Websphere에서 승인 한 lib (가장 좋은 EAR 라이브러리)를 제거하는 것입니다.

+1

실제로 이것은 일어난 것으로 보입니다. 서블릿 전쟁은 "빌드 경로에 필수 프로젝트"로 나열되었습니다. 이 종속성을 제거하면 빌드 시간이 현저히 줄어들뿐만 아니라 문제가 해결되었습니다. – Timbuck

+0

흠 ... 며칠 동안 제대로 작동 한 후에는 오류가 설명되지 않은 방식으로 다시 나타납니다. 내 PC가 그렇게 느리지 않았다면이 문제를 빨리 해결할 수 있었을 것입니다. – Timbuck

0

버전 관리가 될 수도 있지만 그렇게하는 것은 아닙니다.

두 클래스가 다른 클래스 로더에 의해로드 될 때 ClassNotFoundException이 정상적으로 발생합니다.

클래스가 유선을 통해 전달되거나 디스크 캐시에서로드 될 때 일반적으로 VersionMismatchException이 발생합니다.

메서드 서명이 다른 클래스를 사용하면 NoSuchMethodError 또는 유사하게 throw됩니다.

이 사례는 손상된 클래스 파일이라고 생각합니다. 캐시 또는 JAR에서 손상되었을 수 있습니다.

+1

내 경험에 따르면 NoSuchMethodError는 일반적으로 버전 문제를 던져 버리고 클래스가 NO 클래스 로더에있을 때 webspehre, weblogic 및 jboss에서 ClassNotFoundException 만 보았습니다. LinkageError와 ClassCastException (또는 instanceof 검사)은 클래스 로더 문제에서 가장 일반적입니다. –

관련 문제