如何自动获取任意JAR包依赖?静态分析时自动查找缺失类所属JAR
如何在无IDE环境下自动获取JAR包缺失依赖的对应JAR
这问题我碰到过好多次——静态分析JAR时遇到没声明的依赖类,手动找真的费时间,下面几个纯命令行/工具的自动化方案,亲测好用:
方案一:用Maven命令行直接搜索并下载
Maven本身就带了查找类所在artifact的功能,步骤超简单:
- 确保你已经装了Maven并配好环境变量
- 针对缺失的类(比如你提到的
javax.servlet.http.HttpServlet,注意是HttpServlet不是HTTPServlet哦),执行搜索命令:mvn dependency:search -Dquery=class:javax.servlet.http.HttpServlet - 命令输出里会显示包含这个类的Maven artifact,比如
javax.servlet:javax.servlet-api:3.1.0 - 接着用这条命令下载对应的JAR包到指定目录(比如
./missing-jars):mvn dependency:copy -Dartifact=javax.servlet:javax.servlet-api:3.1.0 -DoutputDirectory=./missing-jars
方案二:结合JDeps写脚本批量处理
既然你已经用JDeps找出了缺失类,那就可以写个脚本自动化整个流程,不用手动一个个搜:
- 先用JDeps导出所有缺失类到文件:
jdeps -missing jython-2.7.1b3.jar > missing-classes.txt - 写个Shell脚本(Windows的话可以改成批处理)遍历处理:
#!/bin/bash # 创建存储缺失JAR的目录 mkdir -p ./missing-jars while read -r line; do # 从JDeps的输出里提取全限定类名 class=$(echo "$line" | grep -oP '(\w+\.)+\w+' | head -1) if [ -n "$class" ]; then echo "正在查找类:$class" # 搜索对应的artifact,静默执行并保存结果 mvn dependency:search -Dquery=class:$class -DoutputFile=/tmp/tmp-search.txt -q artifact=$(grep -oP '(\w+:\w+:\d+\.\d+\.\d+)' /tmp/tmp-search.txt | head -1) if [ -n "$artifact" ]; then echo "下载依赖:$artifact" mvn dependency:copy -Dartifact=$artifact -DoutputDirectory=./missing-jars -q else echo "未找到类$class对应的公开依赖" fi fi done < missing-classes.txt - 给脚本加执行权限(
chmod +x download-missing-jars.sh),运行后就会自动把所有能找到的缺失依赖JAR下载到missing-jars目录。
方案三:用JBoss Tattletale生成分析报告
这是个专门的JAR依赖分析工具,能帮你生成可视化的报告,还直接给出缺失依赖的建议坐标:
- 下载Tattletale的JAR包(直接从官方渠道获取即可)
- 执行分析命令:
java -jar tattletale.jar jython-2.7.1b3.jar - 工具会在当前目录生成一个
report文件夹,打开里面的HTML报告,找到"Missing dependencies"部分,里面会列出每个缺失类对应的建议Maven坐标,你再用Maven或者直接下载工具获取对应的JAR包就行。
几个注意事项
- 先确认类名拼写正确!你提到的
javax.servlet.HTTPServlet其实是拼写错误,正确的是javax.servlet.http.HttpServlet,拼写错了肯定搜不到。 - 如果缺失类属于私有仓库或者非开源依赖,Maven中央仓库搜不到的话,就得去对应的项目官网或者内部仓库找了。
- 要是用私有仓库,记得在Maven的
settings.xml里配置好仓库地址,不然Maven搜不到。
内容的提问来源于stack exchange,提问作者Edoardo Vignati




