为什么java.lang.NoSuchMethodError出现非常特定于环境或类加载器?

我目前正在开发一个项目,其中包含log4j-over-slf4j.jar文件。在所有的环境中,这个罐子都在工作。但突然间我有一台WebSphere应用程序服务器。 我们的产品在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

我的Tomcat的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

回答:

不能确定准确的环境,但我几乎可以肯定你会得到一些类库的意外版本。如果在从Tomcat切换到WebSphere(或其他方式)之后发生问题,他们可能有不同版本的与slf4相关的东西(或其中一个库有另一个缺失的库)。大多数情况下,java的-verbose:class选项应该可用于挖掘从何处获得类的内容

回答:

当您的代码使用不同于您的环境提供的代码版本进行编译时,会出现此类错误。

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

回答:

NoSuchMethod错误。基本上这可能是由于升级/降级或进入新环境时版本冲突造成的。

的深入描述在这里。

Docker Image of Jersey Web Application

检查应用程序库VS服务器提供的库不会是在这里使用。重要的是JVM类加载器在运行时加载的库/类。

分析哪些是通过java.class.path系统属性加载的类https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

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

然后将它们与你的Tomcat版本提供的罐子进行比较。

以上是 为什么java.lang.NoSuchMethodError出现非常特定于环境或类加载器? 的全部内容, 来源链接: utcz.com/qa/261451.html

回到顶部