如何用Maven识别运行时依赖?解决重构中的依赖误判问题
针对你遇到的mvn dependency:analyze误判运行时依赖、且无scope标签的情况,推荐几个靠谱的方法:
生成运行时完整类路径
执行mvn dependency:build-classpath -Dmdep.outputFile=runtime-classpath.txt,会把项目运行时需要的所有依赖(包括传递依赖)输出到文件里。你可以结合项目的启动脚本或运行配置,对比实际加载的JAR,筛选出真正用到的部分。用IDE的依赖分析工具
比如IntelliJ IDEA,打开项目后通过File > Project Structure > Modules > Dependencies查看依赖,或者用Analyze > Run Inspection by Name搜索“Unused Declared Dependencies”,记得在检查配置里把Scope设为“Runtime”,这样能更精准识别运行时用到的依赖,避免误判反射或动态加载的库。筛选运行时依赖树
执行mvn dependency:tree -Dscope=runtime,这个命令会只展示运行时生效的依赖(包括传递依赖)。虽然你没加scope标签,但Maven默认scope是compile,而compile范围的依赖会被包含在运行时,所以这个树能帮你快速定位运行时的依赖层级,再结合实际运行场景剔除冗余项。运行时类加载追踪
用Java自带的jcmd工具:先启动项目,找到进程ID,然后执行jcmd <pid> VM.classloader_stats,能看到每个类加载器加载的JAR和类数量。或者用Arthas的classloader -l命令,更直观地查看哪些JAR被实际加载了,这些就是运行时必需的依赖。逐步移除验证
对疑似冗余的依赖,先注释掉,然后运行项目的核心业务场景、单元测试、集成测试。如果运行正常,说明这个依赖确实没用;如果报错,就标记为运行时必需的依赖,恢复回来。这种方法虽然耗时,但适合大型项目逐步清理,能确保不会误删关键依赖。
内容的提问来源于stack exchange,提问作者FrankDev

