进行注解的测试,添加注解,并在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目录中,后续找到会再次记录。