專案依賴上百個 JAR,用 `jar tf` 逐個解壓列表查找類文件,I/O 開銷巨大,往往需數分鐘。
7z 讀取壓縮包索引不解壓本體,速度比 `jar` 快數量級。
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 ← 找到!
@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..."
"======================================"
#!/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 開源 (LGPL),若頻繁需求,可修改源碼使 `7z l` 直接輸出 `jar路徑#類路徑`,省去外層腳本解析,單命令搞定。