Spring5.2.X源代码编译-问题-Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]

  进行注解的测试,添加注解,并在config.xml配置了包扫描的内容:

    <context:component-scan base-package="org.example.*"/>

  运行代码后报错:

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
Offending resource: class path resource [config.xml]

    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:72)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:119)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:111)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:281)
...

  后查询出是因为依赖的是Module,找到Spring-context.main中的编译文件中,META-INF下没有spring.handlers文件。于是修改了该子工程的spring-context.gradle文件:

  

  在原先内容的基础上添加了新的打包语句,作用是JAR包需要包含META-INF下的内容:

jar {
    from('./src/main/java') {
        include 'META-INF/*'
    }
}

  打包后,可以解压该JAR包,发现其中有我们需要的配置文件。此时SpringFrameworkDemo的Project Structure需要修改依赖。

  找到对应的工程结构,点击+并选择第一个:

  

   找到刚才打出的JAR包,并添加进去:

  

   取消对原先Module的依赖,并重新依赖新的JAR包:

  

   Apply-OK。

  再次运行代码,该问题解决,跟踪代码,会发现此时进入到已打好的JAR包中。

  如果有调试的需求,还是想进入到之前的依赖Module,修改源代码或者注释的内容模式时,可以将JAR包解压,找到META-INF目录下所有的文件,拷贝到spring-contextuildclassesjavamainMETA-INF目录下,然后再次添加对spring-context.main的Module依赖,并去除对之前的JAR包依赖即可。既可以进行源代码的修改,也解决了上文提到的问题。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  后记:目前没有找到合适的方法,最便捷的应该是用Gradle直接在build时就把相关的META-INF文件生成到spring-contextuildclassesjavamainMETA-INF目录中,后续找到会再次记录。

原文地址:https://www.cnblogs.com/bruceChan0018/p/14233565.html