使用FileSystemXmlApplicationContext编译Spring应用程序时出现NoSuchMethodError

时间:2016-09-27 05:46:00

标签: java spring maven

当运行一个非常基本的Spring应用程序并使用 FileSystemXmlApplicationContext 创建Bean Factory时,遇到 NoSuchMethodError

beans.xml 文件位于带有pom.xml的应用程序的根目录下,如下所示:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<bean id="person" class="com.xyz.practice.Person">

</bean>

</beans>

Person类看起来像:

  package com.xyz.practice;

public class Person {
    public void speak(){
        System.out.println("Hello I'm a Person");
    }
}

主类App.java如下所示:

    package com.xyz.practice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class App {

    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");
        Person person = (Person) context.getBean("person");
        person.speak();
    }

}

运行应用程序时,会抛出以下异常:

INFO: Loading XML bean definitions from file [/home/salmank/Documents/springWithAbc/beans.xml]
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.beans.factory.config.ConfigurableListableBeanFactory.clearMetadataCache()V
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:185)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520)
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
    at com.xyz.practice.App.main(App.java:9)

3 个答案:

答案 0 :(得分:2)

您的类路径中包含不兼容的jar文件。检查spring-context-supportspring-beans的版本 缺少的方法是在4.2版本中引入的:

  

void clearMetadataCache()

     

清除合并的bean定义缓存,删除bean的条目   哪些不符合完整元数据缓存的条件。   通常在更改原始bean定义后触发,   例如在应用BeanFactoryPostProcessor之后。请注意元数据   此时已经创建的bean将被保留   周围。

     

自:4.2

     

另见:getBeanDefinition(java.lang.String),   ConfigurableBeanFactory.getMergedBeanDefinition(java.lang.String中)

检查spring-context-support的版本是否与spring-beans

相同

顺便说一句:删除xsd位置末尾的版本:

http://www.springframework.org/schema/beans/spring-beans.xsd">

答案 1 :(得分:2)

您正在pom.xml中混合使用不同的版本(spring-core.jar和spring-beans.jar)。请更正如下。

在:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.2.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.1.1.RELEASE</version>
</dependency>   

后:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.2.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.2.5.RELEASE</version>
</dependency>

答案 2 :(得分:1)

这是由于春天的自由版本之间的版本不匹配。

void clearMetadataCache()方法已添加到ConfigurableListableBeanFactory since 4.2.0 version release中。因此,如果您使用的是spring-beans库版本less than 4.2.0 versions,则可能会遇到Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.beans.factory.config.ConfigurableListableBeanFactory.clearMetadataCache()V这种异常。

因此,尝试在lib中添加适当的版本jar。

Added Methods ::
    spring-beans-4.2.0.RELEASE.jar, 
    ConfigurableListableBeanFactory.class
    package org.springframework.beans.factory.config
    ConfigurableListableBeanFactory.clearMetadataCache ( ) [abstract]  :  void 

有关详细信息,您也可以参考此网址:https://abi-laboratory.pro/java/tracker/compat_report/spring-framework/4.1.9/4.2.0/e1bb7/src_compat_report.html#Added