You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何自动获取任意JAR包依赖?静态分析时自动查找缺失类所属JAR

如何在无IDE环境下自动获取JAR包缺失依赖的对应JAR

这问题我碰到过好多次——静态分析JAR时遇到没声明的依赖类,手动找真的费时间,下面几个纯命令行/工具的自动化方案,亲测好用:

方案一:用Maven命令行直接搜索并下载

Maven本身就带了查找类所在artifact的功能,步骤超简单:

  1. 确保你已经装了Maven并配好环境变量
  2. 针对缺失的类(比如你提到的javax.servlet.http.HttpServlet,注意是HttpServlet不是HTTPServlet哦),执行搜索命令:
    mvn dependency:search -Dquery=class:javax.servlet.http.HttpServlet
    
  3. 命令输出里会显示包含这个类的Maven artifact,比如javax.servlet:javax.servlet-api:3.1.0
  4. 接着用这条命令下载对应的JAR包到指定目录(比如./missing-jars):
    mvn dependency:copy -Dartifact=javax.servlet:javax.servlet-api:3.1.0 -DoutputDirectory=./missing-jars
    

方案二:结合JDeps写脚本批量处理

既然你已经用JDeps找出了缺失类,那就可以写个脚本自动化整个流程,不用手动一个个搜:

  1. 先用JDeps导出所有缺失类到文件:
    jdeps -missing jython-2.7.1b3.jar > missing-classes.txt
    
  2. 写个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
    
  3. 给脚本加执行权限(chmod +x download-missing-jars.sh),运行后就会自动把所有能找到的缺失依赖JAR下载到missing-jars目录。

方案三:用JBoss Tattletale生成分析报告

这是个专门的JAR依赖分析工具,能帮你生成可视化的报告,还直接给出缺失依赖的建议坐标:

  1. 下载Tattletale的JAR包(直接从官方渠道获取即可)
  2. 执行分析命令:
    java -jar tattletale.jar jython-2.7.1b3.jar
    
  3. 工具会在当前目录生成一个report文件夹,打开里面的HTML报告,找到"Missing dependencies"部分,里面会列出每个缺失类对应的建议Maven坐标,你再用Maven或者直接下载工具获取对应的JAR包就行。

几个注意事项

  • 先确认类名拼写正确!你提到的javax.servlet.HTTPServlet其实是拼写错误,正确的是javax.servlet.http.HttpServlet,拼写错了肯定搜不到。
  • 如果缺失类属于私有仓库或者非开源依赖,Maven中央仓库搜不到的话,就得去对应的项目官网或者内部仓库找了。
  • 要是用私有仓库,记得在Maven的settings.xml里配置好仓库地址,不然Maven搜不到。

内容的提问来源于stack exchange,提问作者Edoardo Vignati

火山引擎 最新活动