2017-12-18 21 views
0

현재 log4j-over-slf4j.jar 파일이있는 프로젝트에서 작업하고 있습니다. 모든 환경에서이 병은 작동하고있었습니다. 하지만 갑자기 필자는 WebSphere Application Server를 가지고 있습니다. 우리 제품은 Tomcat 서버에서 작동하며 갑자기 응용 프로그램이 다른 환경에서 생성하는 동안 로그를 만들지 못했습니다. 프로젝트에서 jar 파일을 제거하려고하면 로그를 생성 할 수 있습니다.java.lang.NoSuchMethodError가 환경 또는 클래스 로더에 매우 특정한 이유는 무엇입니까?

그러나이 특정 환경에만 특정 작업을 수행해야하는 이유를 식별 할 수 없습니다.

또는 서버 런타임에 클래스 로더 정보를 식별하여 어떤 클래스가로드되었는지 또는 어떤 메소드가로드되었는지 식별하려면 어떻게해야합니까?

내 JDK 버전은 다음과 같습니다 "1.7.0_71"

내 응용 프로그램이 라이브러리가 포함되어

antlr-2.7.7.jar 
aopalliance-1.0.jar 
asm-1.5.3.jar 
asm-attrs-1.5.3.jar 
axiom-api-1.2.12.jar 
axiom-impl-1.2.12.jar 
axis2-1.6.2.jar 
axis2-kernel-1.6.1.jar 
axis2-transport-http-1.6.1.jar 
axis2-transport-local-1.6.1.jar 
c3p0-0.9.2.1.jar 
cglib-2.1_3.jar 
com.ibm.jbatch-tck-spi-1.0.jar 
commons-codec-1.6.jar 
commons-collections-3.1.jar 
commons-fileupload-1.2.jar 
commons-httpclient-3.1.jar 
commons-logging-1.1.3.jar 
dom4j-1.6.1.jar 
ehcache-1.2.3.jar 
geronimo-activation_1.1_spec-1.0.2.jar 
geronimo-javamail_1.4_spec-1.6.jar 
geronimo-jta_1.1_spec-1.1.jar 
geronimo-stax-api_1.0_spec-1.0.1.jar 
geronimo-ws-metadata_2.0_spec-1.1.2.jar 
hibernate-3.2.4.ga.jar 
hibernate-annotations-3.3.0.ga.jar 
hibernate-commons-annotations-3.1.0.GA.jar 
hibernate-core-3.3.0.CR2.jar 
hibernate-ehcache-3.3.0.CR2.jar 
hibernate-entitymanager-3.3.1.ga.jar 
hibernate-jpa-2.0-api-1.0.0.Final.jar 
hibernate-validator-3.1.0.CR2.jar 
httpcore-4.0.jar 
javaetmoi-spring4-vfs2-support-1.4.0.jar 
javassist-3.18.1-GA.jar 
javassist-3.3.GA.jar 
javax.batch-api-1.0.jar 
javax.servlet-api-3.0.1.jar 
jaxen-1.1.1.jar 
jboss-common-core-2.0.4.GA.jar 
jboss-logging-3.3.0.Final.jar 
jettison-1.2.jar 
jsr311-api-1.0.jar 
jta-1.1.jar 
log4j-1.2.17.jar 
log4j-api-2.0.jar 
logkit-1.0.1.jar 
mchange-commons-java-0.2.3.4.jar 
neethi-3.0.1.jar 
oracle-ojdbc6-11.2.0.3.0.jar 
persistence-api-1.0.jar 
poi-3.9.jar 
slf4j-api-1.7.11.jar 
slf4j-simple-1.6.4.jar 
spring-aop-3.2.13.RELEASE.jar 
spring-batch-core-3.0.1.RELEASE.jar 
spring-batch-infrastructure-3.0.1.RELEASE.jar 
spring-beans-3.2.13.RELEASE.jar 
spring-context-3.2.13.RELEASE.jar 
spring-core-3.2.13.RELEASE.jar 
spring-expression-3.2.13.RELEASE.jar 
spring-jdbc-3.2.13.RELEASE.jar 
spring-orm-3.2.13.RELEASE.jar 
spring-retry-1.0.3.RELEASE.jar 
spring-tx-3.2.13.RELEASE.jar 
spring-web-4.0.3.RELEASE.jar 
stax-api-1.0.1.jar 
woden-api-1.0M9.jar 
woden-impl-commons-1.0M9.jar 
woden-impl-dom-1.0M9.jar 
wsdl4j-1.6.2.jar 
wstx-asl-3.2.9.jar 
xmlbeans-2.5.0.jar 
xmlpull-1.1.3.1.jar 
XmlSchema-1.4.7.jar 
xpp3_min-1.1.4c.jar 
xstream-1.4.7.jar 

내 바람둥이 lib 디렉토리가 포함되어 정확한 환경에 대한

annotations-api.jar 
catalina-ant.jar 
catalina-ha.jar 
catalina.jar 
catalina-storeconfig.jar 
catalina-tribes.jar 
ecj-4.5.jar 
el-api.jar 
jasper-el.jar 
jasper.jar 
jsp-api.jar 
ojdbc6-11.2.0.3.jar 
servlet-api.jar 
sqljdbc4-11.1.0.7.0.jar 
tomcat-api.jar 
tomcat-coyote.jar 
tomcat-dbcp.jar 
tomcat-i18n-es.jar 
tomcat-i18n-fr.jar 
tomcat-i18n-ja.jar 
tomcat-jdbc.jar 
tomcat-jni.jar 
tomcat-juli.jar 
tomcat-util.jar 
tomcat-util-scan.jar 
tomcat-websocket.jar 
websocket-api.jar 

답변

0

확실하지 않음을 ,하지만 클래스 라이브러리가 예상치 못한 버전으로 바뀌 었다고 확신 할 수 있습니다. Tomcat에서 WebSphere로 전환 한 후 (또는 다른 방향으로) 문제가 발생하면 slf4 관련 다른 버전 (또는 그 중 하나에는 다른 하나가없는 라이브러리가 있음)이있을 수 있습니다. 대부분의 경우 java의 -verbose : 클래스 옵션은 클래스 로딩 된 내용을 파헤치는 데 사용할 수 있어야합니다.

0

환경이 제공하는 코드와 다른 버전의 코드로 코드를 컴파일하면이 유형의 오류가 발생합니다.

public class A{ 
public void a(){ 
} 
} 

//newer version of module 
public class AVariant{ 
public void a(String b){ 
} 
} 

내가 WebSphere에서 그 익숙하지 해요,하지만 여기서 문제가되는 WebSphere 로깅 프레임 워크의 이전/새 또는 버전을 사용하는, 즉 응용 프로그램을 컴파일 된 버전이 호환되지 않습니다. 이 종속성 충돌을 해결해야합니다.

이 가이드는 당신을 도울 수 있습니다 : 응용 프로그램이 클래스의 새로운 버전에서 사용할 수 없습니다 클래스의 이전 버전의 메소드를 호출하려고했을 경우에 https://www.slf4j.org/legacy.html

+0

답변 주셔서 감사합니다. 우리는 NoSuchMethodError가 발생하는 방법을 알고 있지만 제 질문은 그 항아리를 제거해야하는 이유입니다. – 5A9U

0

NoSuchMethod 오류가 발생합니다. 근본적으로 이것은 업 그레이드/다운 그레이드 또는 새로운 환경으로 이동할 때 버전 충돌로 인해 발생할 수 있습니다.

는 심층적 인 설명은 여기

를 참조하십시오. 서버 제공 libs와 대

Docker Image of Jersey Web Application

확인 응용 프로그램 libs와 실 거예요 여기에 사용합니다. 중요한 것은 런타임에 JVM 클래스 로더가 libs/클래스를로드하는 것입니다.

https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

System.getProperty("java.class.path"); 

그런 java.class.path를 시스템 속성을 통해 클래스를로드 톰캣 버전 제공 항아리과 비교 무엇을 분석합니다.

+0

classpath에는 아무 것도 변경되지 않았습니다. 여전히 동일합니다. 우리는 기본적으로 tomcat의 classpath에 bootstrap.jar & tomcat-juli.jar를 사용하고 있습니다. – 5A9U

+0

오류 로그를 게시 할 수 있습니까? –