代码之家  ›  专栏  ›  技术社区  ›  5A9U

为什么选择java。lang.NoSuchMethodError是否发生特定于环境或类加载器的错误?[副本]

  •  0
  • 5A9U  · 技术社区  · 7 年前

    我目前正在从事一个项目,我们有log4j-over-slf4j。jar文件。在所有的环境中,这个罐子都能工作。但突然间,我有了一个WebSphere application server。 我们的产品在tomcat服务器上工作,当我们的应用程序在另一个环境中创建日志时,它突然无法创建任何日志。如果我尝试从项目中删除这个jar,那么我就能够生成日志。

    但我无法确定为什么我应该只针对这个特定的环境来做。

    或者,我应该如何在服务器运行时识别类加载器信息,以识别加载了哪个类或加载了哪个方法?

    我的jdk版本是:“1.7.0\u 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
    
    3 回复  |  直到 7 年前
        1
  •  0
  •   Kalpa Gunarathna    7 年前

    当应用程序试图调用类的早期版本上的方法,而新版本的类上没有该方法时,就会发生NoSuchMethod错误。基本上,这可能是由于升级/降级或移动到新环境时版本冲突引起的。

    看见 https://docs.oracle.com/javase/9/docs/api/java/lang/NoSuchMethodError.html

    这里有一个深入的描述。

    Docker Image of Jersey Web Application

    在这里,检查应用程序libs与服务器提供的libs是没有用的。重要的是JVM类加载器在运行时加载了哪些库/类。

    分析通过java加载的类。班路径系统属性 https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

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

    然后将它们与您的tomcat版本提供的JAR进行比较。

        2
  •  0
  •   Daniel Hristov    7 年前

    不确定具体的环境,但我几乎可以肯定您得到了一些类库加载的意外版本。如果问题发生在从Tomcat切换到WebSphere之后(或者反过来),那么很可能是他们有不同版本的与slf4相关的东西(或者其中一个有一个库,而另一个缺少)。大多数情况下,java的-verbose:class选项应该可以用于挖掘从何处加载类的内容

        3
  •  0
  •   JSONStatham    7 年前

    当您的代码使用不同于您的环境提供的代码版本编译时,您会遇到这种类型的错误。

    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