Spring加载ApplicationContext失败:路径正确却报ClassNotFoundException(Groovy类)
嘿,我碰到过好几个和你一模一样的问题——明明类路径对、文件位置也没错,但Spring就是找不到那个Groovy类。结合你的描述,这几个原因大概率能帮你定位问题:
Groovy编译配置没跟上
Spring本身不会自动编译Groovy文件,必须靠构建工具(Maven/Gradle)的Groovy插件来处理。如果你的MissingClass.groovy没被编译成.class文件,Spring肯定找不到它。
举个例子,Maven的话要在pom.xml里加这个插件:<build> <plugins> <plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> <version>1.13.1</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>Gradle更简单,直接加Groovy插件:
plugins { id 'groovy' id 'java' }加完别忘重新构建(
mvn clean compile或gradle compileGroovy),确保Groovy文件被编译到classpath里。Groovy类的定义有问题
检查下MissingClass.groovy的类名是否和文件名完全一致(大小写也得匹配)!Groovy和Java一样,类名必须和文件名对应,比如文件叫MissingClass.groovy,类就得是class MissingClass { ... },不能小写或者改名字。另外,别写成Groovy脚本(省略class关键字的那种),脚本没法被Spring实例化成Bean,必须是正经的类。构建工具的资源过滤坑
有时候Maven/Gradle会把Groovy文件排除在输出目录外。比如Maven的resources配置如果只包含.java,那Groovy文件不会被复制过去。检查下pom.xml里的资源配置,确保没漏掉.groovy:<resources> <resource> <directory>src/main/groovy</directory> <includes> <include>**/*.groovy</include> </includes> </resource> </resources>Gradle默认会处理
src/main/groovy,但如果自定义了sourceSets,也要确认Groovy源目录配置正确。IDE缓存搞鬼
有时候IDE的缓存会导致编译后的文件没更新,比如IntelliJ的缓存可能还停留在之前的状态。试试清理IDE缓存(IDEA里点File -> Invalidate Caches...,选Invalidate and Restart),然后重新构建运行。
最可能的就是第一个原因——很多人刚开始用Groovy+Spring时,都会忘了配置编译插件,导致文件没被编译,Spring自然找不到对应的类。先从这个入手排查吧!
内容的提问来源于stack exchange,提问作者Maria-Andersado

