首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

命令行秒找 Class 所在 JAR:7z + 批處理/Shell 替代慢速 jar 命令

     編輯:Java 相關知識

痛點:`jar tf` 掃描大量 JAR 極慢

專案依賴上百個 JAR,用 `jar tf` 逐個解壓列表查找類文件,I/O 開銷巨大,往往需數分鐘。

解決方案:7-Zip 命令行 (7z.exe / 7z) + 管道過濾

7z 讀取壓縮包索引不解壓本體,速度比 `jar` 快數量級。

Windows 單行命令

for %i in (dir /b /s *.jar) do 7z l "%i" | findstr XDatabase.class

實測輸出:

D:\shared\xsql>for %i in (dir /b /s *.jar) do 7z l "%i" | findstr XDatabase.class
...
D:\shared\xsql>7z l xsql.jar | findstr XDatabase.class
2010-12-24 21:05:40 ..... 30863 14443  com\sean\db\XDatabase.class  ← 找到!

通用批處理腳本:findclass.bat

@echo off
SETLOCAL
set WHICH_CLASS=%1
echo WHICH_CLASS=%WHICH_CLASS%

for /F %%i in ('dir /A:-D /S /B *.jar') do (
    7z l "%%i" | findstr %WHICH_CLASS% && echo %WHICH_CLASS% found in: "%%i"
)
echo "Finished class finding..."
echo "======================================"
ENDLOCAL

使用:

> findclass.bat com\\Sybase\\afx\\util\\StringUtil.class
WHICH_CLASS=com\Sybase\afx\util\StringUtil.class
2012-02-27 13:14:36 ..... 15230 5915 com\Sybase\afx\util\StringUtil.class
com\Sybase\afx\util\StringUtil.class found in: "U:\target\lib\ext\sup-client.jar"
2012-02-27 13:14:36 ..... 15230 5915 com\Sybase\afx\util\StringUtil.class
com\Sybase\afx\util\StringUtil.class found in: "U:\target\lib\ext\sup-server-rt.jar"
"Finished class finding..."
"======================================"

Linux/macOS Shell 版

#!/bin/bash
# findclass.sh
CLASS_PATTERN=${1//./\\.}  # 點號轉義
find . -name "*.jar" -exec sh -c '7z l "$1" | grep -q "$2" && echo "Found in: $1"' _ {} "$CLASS_PATTERN" \;

用法:`./findclass.sh com.sean.db.XDatabase`

進階:修改 7z 源碼直接輸出完整路徑

7z 開源 (LGPL),若頻繁需求,可修改源碼使 `7z l` 直接輸出 `jar路徑#類路徑`,省去外層腳本解析,單命令搞定。

依賴安裝

  • Windows:下載 7-Zip 並將安裝目錄加入 PATH
  • Linux:`sudo apt-get install p7zip-full` / `yum install p7zip`
  • macOS:`brew install p7zip`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved