Java 標準庫 java.net 僅支援傳輸層(TCP/UDP)操作,若需處理數據鏈路層(如抓包、造包、ARP 欺騙等),必須借助 Jpcap。Jpcap 底層調用 libpcap (Linux) / WinPcap (Windows),為 Java 提供跨平台的統一接口。本文記錄兩大主流作業系統的安裝全流程與踩坑避坑指南,供日後查閱。
sudo apt-get update sudo apt-get install build-essential libpcap-dev
libpcap-dev 提供編譯所需的頭文件與靜態庫;若 apt 版本過舊,可參考文末參考鏈接手動編譯最新版 libpcap。
git clone --recursive https://github.com/mgodave/Jpcap.git cd Jpcap/src/main/c make
編譯成功會在當前目錄產生 libjpcap.so。
# 1. 複製 .so 到 JRE 原生庫目錄 (架構對應:amd64/i386 等) sudo cp libjpcap.so $JAVA_HOME/jre/lib/amd64/ # 2. 複製 jar 到擴展類路徑 sudo cp ../lib/jpcap.jar $JAVA_HOME/jre/lib/ext/ # 3. 確保 CLASSPATH 包含上述目錄 (通常已默認包含) export CLASSPATH=$CLASSPATH:$JAVA_HOME/jre/lib/ext/jpcap.jar
注意:Java 6 需放入
/usr/java/packages/lib/ext;Java 9+ 模組化後建議使用-Djava.library.path指定原生庫路徑,而非污染 JRE 目錄。
| 錯誤現象 | 原因 | 解決方案 |
|---|---|---|
libpcap.so.1 cannot open shared object file |
動態鏈接器找不到 libpcap | 編輯 /etc/ld.so.conf 新增 /usr/local/lib 與 /usr/lib,執行 sudo ldconfig |
couldn't find default device: no suitable device found |
非 root 權限無法開啟網卡混雜模式 | 使用 sudo java -cp ... YourClass 或授予 CAP_NET_RAW 權限 |
先安裝 WinPcap(或維護中的 Npcap,勾選「WinPcap API-compatible Mode」)。
Jpcap.dll → C:\Windows\System32jpcap.jar → C:\Windows\Sun\Java\lib\extJpcap.dll → %JAVA_HOME%\jre\binjpcap.jar → %JAVA_HOME%\jre\lib\extjpcap.dll、jpcap.jar%JAVA_HOME%\jre\bin\jpcap.dll%JAVA_HOME%\jre\lib\ext\jpcap.jarUnsatisfiedLinkError,在 VM 參數添加:-Djava.library.path=你的dll所在目錄import jpcap.*;
public class TestJpcap {
public static void main(String[] args) {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
for (NetworkInterface d : devices) {
System.out.println(d.name + " - " + d.description);
}
}
}
輸出網卡列表即代表環境就緒。
避坑心得:生產環境建議容器化部署時將
libjpcap.so、jpcap.jar打入鏡像,並以--cap-add=NET_RAW啟動容器,避免宿主機環境差異導致「開發機能跑、生產掛」的尷尬。