Spring 扫描不到注解
问题现象
项目中使用了如下配置,进行扫描。
<ctx:component-scan base-package="com.li.test.rs"/>
但是开发环境中无论如何无法正常扫描到注解类,而生产环境没有此问题。
问题原因
原因很简单,开发环境中项目所在路径中存在空格,所以造成此问题。
原因定位及剖析
首先打开Spring的debug级别日志,发现日志中有如下输出:
[org.springframework.core.io.support.PathMatchingResourcePatternResolver::retrieveMatchingFiles] Skipping [F:\from%20SVN\xx\xx\xx\xx\xx\com\li\test\rs] because it does not exist
查看对应源码可以找到如下内容:
if (!rootDir.exists()) { // Silently skip non-existing directories. if (logger.isDebugEnabled()) { logger.debug("Skipping [" + rootDir.getAbsolutePath() + "] because it does not exist"); } return Collections.emptySet(); }
继续查看源码,我们可以定位到rootDir的值初始来源于ClassLoader的findResources,该方法返回的是可枚举的URL对象。
进行如下测试(在项目的classes目录下创建了com/l j目录):
public static void main(String[] args) throws Exception { Enumeration<URL> urls = Test.class.getClassLoader().getResources("com/l j/"); String aa = null; while(urls.hasMoreElements()){ aa = urls.nextElement().getFile(); } String bb = aa.substring(1); File file = new File(bb); System.out.println("File path is " + file.getAbsolutePath()); System.out.println("File exist " + file.exists()); File file1 = new File(bb.replace("%20", " ")); System.out.println("File1 path is " + file1.getAbsolutePath()); System.out.println("File1 exist " + file1.exists()); }
输出为:
File path is D:\workapace\cc\MyTest\build\classes\com\l%20j File exist false File1 path is D:\workapace\cc\MyTest\build\classes\com\l j File1 exist true
至此问题已经很明显了。