使用Proguard混淆后spring中的bean无法自动加载分析

📅 发布时间:2026/7/5 3:20:10 👁️ 浏览次数:
使用Proguard混淆后spring中的bean无法自动加载分析
问题现象使用proguard后的jar中的Service类无法被自动加载未使用proguard的可以被自动加载。*************************** Description: Field dictService in com.xx.xx.xx.xx.service.XxService required a bean of type com.xx.xx.xx.dict.service.DictService that could not be found. The injection point has the following annotations: - org.springframework.beans.factory.annotation.Autowired(requiredtrue) Action:问题追踪org.springframework.core.io.support.PathMatchingResourcePatternResolver#findPathMatchingResourcesif (rootDirResources null) { rootDirResources this.getResources(rootDirPath); if (this.useCaches null || this.useCaches) { this.rootDirCache.put(rootDirPath, rootDirResources); } }org.springframework.core.io.support.PathMatchingResourcePatternResolver#doFindAllClassPathResourcesprotected SetResource doFindAllClassPathResources(String path) throws IOException { SetResource result new LinkedHashSet(16); ClassLoader cl this.getClassLoader(); EnumerationURL resourceUrls cl ! null ? cl.getResources(path) : ClassLoader.getSystemResources(path); while(resourceUrls.hasMoreElements()) { URL url (URL)resourceUrls.nextElement(); result.add(this.convertClassLoaderURL(url)); } if (!StringUtils.hasLength(path)) { this.addAllClassLoaderJarRoots(cl, result); } return result; }此处 cl.getResources(path) 无法读取到对应的目录的jar编写测试类为了方便调试编写测试类读取classloader中包含对应包且可以读取的jarpackage com.xx.xx.xx.classloader; import java.io.IOException; import java.net.URL; import java.util.Enumeration; /** * author pp_lan * since 2026-03-09 */ public class ProguardTest { public static void main(String[] args) { String path com/xx/xx/; ClassLoader cl ProguardTest.class.getClassLoader(); try { EnumerationURL urls cl.getResources(path); if (!urls.hasMoreElements()) { System.out.println(未找到任何资源。); // 打印该类加载器能看到的 URL 列表仅限 URLClassLoader if (cl instanceof java.net.URLClassLoader) { java.net.URLClassLoader ucl (java.net.URLClassLoader) cl; for (java.net.URL url : ucl.getURLs()) { System.out.println(Classpath 条目: url.getFile()); } } } else { while (urls.hasMoreElements()) { System.out.println(找到资源: urls.nextElement().toString()); } } } catch (IOException e) { e.printStackTrace(); } } }分析比较混淆之前的jar和之后的jar问题最大原因:1. class存在反编译工具打开后能看到对应的类及路径但是目录条目本身不存在修改需要添加目录保留# 保留目录条目确保类加载器能识别目录资源 -keepdirectories验证测试类验证通过找到资源: file:/D:/workspace/xx/xx/retrieve/target/test-classes/com/xx/xx/ 找到资源: file:/D:/workspace/xx/xx/retrieve/target/classes/com/xx/xx/ 找到资源: jar:file:/D:/repository/com/xx/xx/xx-common/1.0.1-SNAPSHOT/xx-common-1.0.1-20260309.022850-2.jar!/com/xx/xx/ 找到资源: jar:file:/D:/repository/com/xx/xx/xx-base/1.0.0-SNAPSHOT/xx-base-1.0.0-SNAPSHOT.jar!/com/xx/xx/项目启动验证通过启动成功