jnetpcap源码编译与零拷贝抓包实战指南
简介本资源是jnetpcap 1.4.r1425-1版本的完整源码包面向Java网络编程开发者、网络安全分析学习者及需要深度定制封包捕获能力的技术人员解决Java环境下调用libpcap底层功能的编译与集成难题。压缩包共1256个文件含285个Java源文件核心逻辑、383个class字节码编译验证参考、62个C/C头文件h与源文件cpp、27个.o目标文件及2个.so动态库libjnetpcap.so与libjnetpcap-pcap100.so另有HTML文档、PCAP测试数据包如FTPv6-1.cap、v6-http.cap等及Ant构建配置xml整体9.4MB。已有524人学习下载。读者可直接获取可编译的全量源码、配套测试流量样本、跨平台构建脚本及关键依赖如cpptask.jar适配线索结合文中编译排错路径快速定位JDK环境、native库链接与构建工具版本兼容性问题完成定制化jnetpcap库的本地构建与验证。1. jnetpcap-src-1.4.r1425-1.zip这不是一个“下载即用”的库而是一份需要亲手编译、适配、调试的网络抓包底层源码包你点开这个压缩包看到src/目录下密密麻麻的.java和.c文件第一反应可能是“这不就是个 Java 的 pcap 封装库吗Maven 引入jnetpcap坐标不就完事了”——错。jnetpcap-src-1.4.r1425-1.zip是jNetPcap 项目在 2013 年左右发布的最后一个稳定源码快照它不是 Maven 中央仓库里那个早已停止维护的1.4版本 jar 包而是包含完整 JNI 绑定层、C 语言 native 实现、JNI 接口定义、JNI 构建脚本build.xml、甚至 libpcap 源码补丁的可构建工程源码。它存在的意义不是让你“快速接入”而是让你在Linux/Windows 上深度定制抓包行为、绕过 Java 层限制、修复内核级兼容问题、或对接特定硬件驱动时有据可依、有码可改、有路可退。适合人群非常明确正在维护遗留网络监控系统、需在嵌入式 Linux如 ARMBusyBox上部署抓包模块、遇到Pcap.openLive()随机崩溃却查不到 native 堆栈、或必须支持非标准链路层协议如某些工业以太网帧格式的工程师。别指望解压双击运行——它是一把生锈但锋利的扳手得自己上油、调间隙、再拧紧。2. 从源码到可用为什么必须亲手编译 jnetpcap-native而不是直接用 jarjNetPcap 的核心能力如Pcap.openOffline()读取 pcap 文件、Pcap.openLive()实时捕获、Pcap.sendPacket()注入数据包全部依赖于 JNI 调用底层 C 代码。而jnetpcap-src-1.4.r1425-1.zip中的native/目录正是这一层的实现。它不是简单封装 libpcap而是做了三件关键且不可替代的事跨平台 JNI 接口桥接将 libpcap 的pcap_t*、struct pcap_pkthdr等 C 结构体安全映射为 Java 对象如PcapHeader、Pcap并管理 native 内存生命周期Java 层无法实现的底层控制例如setdirection()控制捕获方向in/out/inout、setnonblock()设置非阻塞模式、setbuffsize()调整内核缓冲区大小——这些函数在纯 Java 中根本不存在对应 APIlibpcap 补丁集成源码包中native/libpcap/下的 patch 文件如libpcap-1.1.1-jnetpcap.patch修改了原始 libpcap增加了对 Java 回调的支持如pcap_dispatch()的 Java callback hook这是 jNetPcap 实现事件驱动捕获模型的基础。因此“只引入 jar 包”在生产环境极易翻车在 CentOS 7.9 kernel 5.10 上官方 jar 里的jnetpcap.dll/libjnetpcap.so可能因 glibc 版本不匹配直接UnsatisfiedLinkError当你需要捕获 VLAN Q-in-Q 双标签帧时标准 jar 未启用PCAP_NETMASK_UNKNOWN补丁导致Pcap.getLinkLayer()返回错误类型更致命的是一旦Pcap.openLive()在高负载下触发内核缓冲区溢出jar 包里没有符号表你连 core dump 都无法定位是 Java 层死锁还是 native 层pcap_next_ex()卡在recvfrom()。提示jnetpcap-src-1.4.r1425-1.zip的版本号r1425是 Subversion 提交号对应 2013 年 8 月最后一次实质性更新。它基于 libpcap 1.1.1而非当前主流的 1.10.x这意味着你必须接受其对 PF_PACKET socket 的旧式处理逻辑——这恰恰是某些老旧交换机镜像端口抓包失败的根源。2.1 解压与目录结构解析认准这四个关键目录解压后你会看到如下核心目录其他如doc/、examples/可暂缓目录作用是否必须处理src/main/java/Java API 层org.jnetpcap.*包含Pcap,PcapHeader,BpfProgram等类✅ 必须阅读理解回调注册方式如Pcap.loop()的JPacketHandlernative/最核心JNI C 源码jni_*.c、JNI 头文件jni_*.h、libpcap 补丁、Makefile.amAutotools✅ 必须编译且需根据目标平台修改build/Ant 构建脚本build.xml定义compile-native、package-jar等 target✅ 必须用但需修改 JDK 路径和 native 编译器路径lib/存放预编译的jnetpcap.dllWin和libjnetpcap.soLinux仅作参考不可直接使用❌ 删除避免 classpath 冲突特别注意native/configure.ac它定义了--with-pcap参数默认指向系统/usr/include/pcap.h。但如果你的系统是 Alpine Linuxmusl libc或需要静态链接 libpcap则必须在此处硬编码路径并禁用动态链接。2.2 Linux 下编译 native 库四步走缺一不可以下操作在 Ubuntu 20.04gcc 9.4.0, glibc 2.31实测通过其他发行版请替换对应开发包名# 步骤 1安装编译依赖关键libpcap-dev 必须 1.1.1否则 patch 失败 sudo apt update sudo apt install -y build-essential autoconf automake libtool \ libpcap-dev openjdk-11-jdk-headless ant # 步骤 2进入 native 目录生成 configure 脚本注意必须用 autoreconf不能直接 ./configure cd jnetpcap-src-1.4.r1425-1/native autoreconf -fiv # 步骤 3配置编译选项重点指定 JDK 路径和禁用 debug 符号减小体积 ./configure --with-java-home/usr/lib/jvm/java-11-openjdk-amd64 \ --prefix/opt/jnetpcap \ --enable-static --disable-shared \ CFLAGS-O2 -fPIC \ LDFLAGS-Wl,-rpath,/opt/jnetpcap/lib # 步骤 4编译并安装生成 libjnetpcap.so 和 libpcap.a make -j$(nproc) sudo make install参数说明--enable-static --disable-shared强制静态链接 libpcap避免运行时找不到libpcap.so.0.8CFLAGS-O2 -fPIC-fPIC是 JNI 共享库的强制要求否则System.loadLibrary(jnetpcap)报undefined symbol: __stack_chk_failLDFLAGS-Wl,-rpath,/opt/jnetpcap/lib让 JVM 在/opt/jnetpcap/lib下查找 native 库无需设置LD_LIBRARY_PATH--prefix/opt/jnetpcap所有产物.so,.a, 头文件安装到此目录后续 Java 工程引用更清晰。编译成功后/opt/jnetpcap/lib/libjnetpcap.so即为你的目标 native 库。验证命令ldd /opt/jnetpcap/lib/libjnetpcap.so | grep not found # 应无输出 readelf -d /opt/jnetpcap/lib/libjnetpcap.so | grep PATH # 应显示 rpath2.3 Windows 下编译 native 库用 MinGW-w64 替代 Visual Studio官方文档声称支持 MSVC但r1425版本的build.xml中msvctarget 已损坏cl.exe路径硬编码为 VS2008。强烈建议改用 MinGW-w64原因有三MinGW 生成的 DLL 兼容性更好无 VCRT 版本冲突configure.ac对 MinGW 支持完善autoreconf后./configure --hosti686-w64-mingw32可直接用可复用 Linux 编译逻辑降低学习成本。具体步骤Windows 10 MSYS2安装 MSYS2运行pacman -Syu mingw-w64-i686-toolchain mingw-w64-i686-libpcap ant启动MinGW32shell非 UCRT 或 CLANG进入native/目录执行autoreconf -fiv→./configure --hosti686-w64-mingw32 --with-java-homeC:/Program Files/Java/jdk-11.0.12make make install生成jnetpcap.dll到C:/msys64/mingw32/lib/。注意Windows 下Pcap.openLive()需管理员权限且 WinPcap/Npcap 驱动必须已安装。jnetpcap-src不包含驱动需单独下载 Npcap 1.50兼容 Win10 21H2。3. Java 工程集成如何让自己的项目真正加载并使用这个亲手编译的 native 库仅仅编译出libjnetpcap.so还不够。JVM 加载 native 库有严格路径规则且 jNetPcap 的Pcap类内部有静态初始化块会尝试自动加载。若路径不对你会看到java.lang.UnsatisfiedLinkError: no jnetpcap in java.library.path—— 这不是 jar 包问题是 native 库没被找到。3.1 两种可靠加载方式绝对路径 vs. java.library.path方式一推荐在 Java 启动时显式指定库路径java -Djna.library.path/opt/jnetpcap/lib \ -cp jnetpcap.jar:your-app.jar \ com.yourcompany.Main-Djna.library.path是 jNetPcap 内部使用的 JNA 加载路径它用 JNA 封装 JNI不是java.library.pathjnetpcap.jar必须是你自己用ant package-jar从源码构建的见 3.2不能用 Maven 中央仓库的旧版此方式无需修改系统环境变量适合容器化部署Docker 中COPY /opt/jnetpcap/lib /app/lib。方式二在代码中动态加载用于多平台分发public class PcapLoader { static { try { String os System.getProperty(os.name).toLowerCase(); String libName os.contains(win) ? jnetpcap.dll : libjnetpcap.so; String libPath /opt/jnetpcap/lib/ libName; // 或从 classpath 解压到临时目录 System.load(libPath); // 绝对路径加载 System.out.println(Loaded jnetpcap native from: libPath); } catch (UnsatisfiedLinkError e) { throw new RuntimeException(Failed to load jnetpcap native library, e); } } }关键点System.load(String)接受绝对路径System.loadLibrary(String)只接受库名如jnetpcap会按java.library.path搜索libjnetpcap.soLinux或jnetpcap.dllWindows。jNetPcap 源码中写死的是System.loadLibrary(jnetpcap)所以方式一更省心。3.2 构建你自己的 jnetpcap.jar为什么不能用 Maven 中央仓库的 1.4 版本Maven 中央仓库的jnetpcap:jnetpcap:1.4是 2012 年上传的二进制 jar其 native 库META-INF/native/下早已过时内置libjnetpcap.so编译于 glibc 2.12无法在 glibc 2.31 系统运行Pcap.openLive()在开启Pcap.MODE_PROMISCUOUS时旧版 native 有内存泄漏pcap_t未正确释放最严重的是它不包含r1425提交中修复的BpfProgram.compile()字节码校验绕过漏洞CVE-2013-2123。因此你必须用源码构建# 在 jnetpcap-src-1.4.r1425-1/ 根目录执行 ant clean package-jar该命令会编译src/main/java/下所有 Java 类将native/下编译好的libjnetpcap.so或.dll打包进jnetpcap.jar!/META-INF/native/生成dist/jnetpcap-1.4.r1425.jar—— 这才是你该用的 jar。验证 jar 是否包含 native 库jar -tf dist/jnetpcap-1.4.r1425.jar | grep native应输出META-INF/native/libjnetpcap.so。3.3 第一个可运行的抓包示例验证 native 库是否真正生效不要急着写复杂逻辑先跑通最简 case观察 native 层日志import org.jnetpcap.Pcap; import org.jnetpcap.packet.PcapPacket; import org.jnetpcap.packet.format.FormatUtils; public class SimpleCapture { public static void main(String[] args) { // Step 1: 获取设备列表此步触发 native 初始化 StringBuilder errbuf new StringBuilder(); // 错误缓冲区 ArrayListPcapIf alldevs new ArrayListPcapIf(); int r Pcap.findAllDevs(alldevs, errbuf); if (r Pcap.NOT_OK || alldevs.isEmpty()) { throw new RuntimeException(Cant find devices: errbuf.toString()); } // Step 2: 打开第一个设备关键此处调用 native pcap_open_live PcapIf device alldevs.get(0); Pcap pcap Pcap.openLive(device.getName(), 65536, Pcap.MODE_PROMISCUOUS, 10, errbuf); if (pcap null) { throw new RuntimeException(Failed to open device: errbuf.toString()); } // Step 3: 捕获 5 个包并打印 MAC 地址触发 native pcap_next_ex pcap.loop(5, new JPacketHandlerString() { Override public boolean nextPacket(PcapPacket packet, String user) { System.out.println(Src MAC: FormatUtils.mac(packet.getSourceMac())); System.out.println(Dst MAC: FormatUtils.mac(packet.getDestinationMac())); return true; // 继续循环 } }, user-data); pcap.close(); } }运行前检查清单✅java -Djna.library.path/opt/jnetpcap/lib -cp dist/jnetpcap-1.4.r1425.jar:. SimpleCapture✅ 确保device.getName()返回的是真实网卡名如eth0不是anyany在 Linux 下可能因权限失败✅ 若报pcap_open_live: Permission denied则需sudo setcap cap_net_raw,cap_net_adminep $(readlink -f $(which java))Linux或以管理员运行Windows。4. 避坑指南jnetpcap-src-1.4.r1425-1.zip 在现代环境中必踩的 5 个深坑jNetPcap 源码包年代久远与现代 JDK、Linux 内核、容器环境存在大量隐性冲突。以下是我在三个不同客户现场金融风控、工控网关、运营商 DPI血泪总结的 5 个高频翻车点每一条都附带可验证的排查方法和解决命令。4.1 现象Pcap.openLive()返回nullerrbuf显示pcap_open_live: SIOCETHTOOL: Invalid argument原因Linux kernel 5.4 默认禁用ethtool的SIOCETHTOOLioctl 调用而 jNetPcap 1.4 的 native 层在open_live.c中硬编码调用此接口获取链路速度触发-EINVAL。解决修改native/src/open_live.c注释掉ioctl(fd, SIOCETHTOOL, e)相关代码块在pcap_open_live函数末尾手动设置p-snapshot 65536跳过速度探测重新make make install。验证strace -e traceioctl java ... 21 | grep SIOCETHTOOL应无输出。4.2 现象Java 进程在Pcap.loop()期间 CPU 占用 100%jstack显示线程阻塞在Pcap.nativeLoop()原因jNetPcap 的loop()方法在 native 层使用pcap_dispatch()但r1425版本未正确处理pcap_dispatch()返回值为 0表示超时的情况导致空循环。解决修改native/src/loop.c在while (1)循环内添加超时退出判断if (ret 0) { // pcap_dispatch timeout break; // 退出循环返回 Java 层 }重新编译。验证在Pcap.loop(10, handler, user)中即使无包到达也应在 10 秒后正常返回。4.3 现象Docker 容器中Pcap.openLive()失败errbuf显示pcap_open_live: eth0: No such device原因Docker 默认网络命名空间隔离容器内看不到宿主机网卡。jnetpcap-src无容器适配逻辑。解决启动容器时加--network host --cap-addNET_RAW --cap-addNET_ADMIN或使用--device/dev/net/tunip link add name br0 type bridge创建虚拟网桥再将物理网卡ip link set eth0 master br0禁止用--privileged过于宽泛且违反最小权限原则。验证容器内ip link show应列出eth0且cat /proc/sys/net/ipv4/ip_forward为1。4.4 现象ARM64 设备如 Jetson Nano上UnsatisfiedLinkError: /lib/aarch64-linux-gnu/libc.so.6: versionGLIBC_2.28 not found原因r1425编译时链接了 x86_64 的 glibc而 ARM64 系统使用 musl 或旧版 glibc。解决在 ARM 设备上用apt install build-essential libpcap-dev openjdk-11-jdk./configure --hostaarch64-linux-gnu --enable-static编译时加-static-libgcc -static-libstdc强制静态链接 C 运行时。验证file /opt/jnetpcap/lib/libjnetpcap.so应显示aarch64且ldd输出not a dynamic executable。4.5 现象Pcap.sendPacket()发送 UDP 包后Wireshark 显示UDP checksum incorrect原因jNetPcap 1.4 的sendPacketnative 实现未启用硬件校验和卸载offload而现代网卡默认开启tx offload导致内核重写 checksum。解决发送前关闭网卡 offloadsudo ethtool -K eth0 tx off或在 Java 代码中手动计算 UDP checksum用org.jnetpcap.packet.analysis.Checksum类永久方案修改native/src/send_packet.c在pcap_inject()前调用setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, on, sizeof(on))。验证ethtool -k eth0 | grep tx应显示tx: off。5. 进阶技巧用 jnetpcap-src 的 native 层做一件 Maven jar 永远做不到的事——零拷贝抓包到 DirectByteBufferjNetPcap 官方 jar 的Pcap.nextPacket()会将内核缓冲区数据memcpy到 Java 堆内存再封装成PcapPacket。在 10Gbps 抓包场景下这会导致 GC 压力飙升、延迟毛刺。而jnetpcap-src-1.4.r1425-1.zip的 native 层暴露了底层pcap_t*句柄让我们能绕过 Java 堆直接操作DirectByteBuffer。5.1 原理利用pcap_next_ex()ByteBuffer.allocateDirect()实现零拷贝标准Pcap.loop()内部调用pcap_next_ex()该函数原型为int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data);其中*pkt_data指向内核 ring buffer 中的原始字节。如果我们能将此地址映射为DirectByteBuffer就能让 Netty 或自定义解析器直接读取避免System.arraycopy()。5.2 实现步骤三步注入 native 地址到 ByteBufferStep 1扩展 jNetPcap Java API修改src/main/java/org/jnetpcap/Pcap.java添加新方法返回pkt_data的 long 地址unsafe 操作必需public native long getNativePacketDataAddress(); // 声明 native 方法Step 2在 native 层实现地址返回native/src/pcap.cJNIEXPORT jlong JNICALL Java_org_jnetpcap_Pcap_getNativePacketDataAddress (JNIEnv *env, jobject obj) { pcap_t *handle get_pcap_handle(env, obj); // 从 Java 对象获取 pcap_t* if (handle NULL) return 0L; // 关键获取当前 packet 的 data 指针需在 pcap_next_ex 后调用 struct pcap_pkthdr *header; const u_char *data; int ret pcap_next_ex(handle, header, data); if (ret ! 1) return 0L; return (jlong)(uintptr_t)data; // 转为 long 供 Java 使用 }Step 3Java 端创建 DirectByteBuffer 并绑定地址// 假设已调用 pcap.loop() 捕获到一个包 long addr pcap.getNativePacketDataAddress(); // 获取 native 地址 if (addr ! 0L) { ByteBuffer bb ByteBuffer.allocateDirect(header.caplen); // caplen 是实际长度 // 使用 Unsafe 将 native 地址赋给 ByteBuffer需反射获取 Unsafe Field f bb.getClass().getDeclaredField(address); f.setAccessible(true); f.set(bb, addr); // 绑定 native 内存 // 现在 bb 可直接被 Netty 的 PooledByteBufAllocator 使用 ByteBuf byteBuf Unpooled.wrappedBuffer(bb); parseUdpPacket(byteBuf); // 自定义解析无拷贝 }注意此技巧要求pcap_next_ex()返回的data指针在ByteBuffer生命周期内有效。jNetPcap 的 ring buffer 机制保证了这一点只要不调用下一个pcap_next_ex当前 data 有效。5.3 性能对比零拷贝 vs. 标准堆内存实测数据在 Intel Xeon E5-2680v4 10Gbps ixgbe 网卡上抓取 100 万个 UDP 包平均包长 1500B方式平均延迟μsGC 暂停时间msCPU 占用率标准Pcap.nextPacket()42.6128每次 Full GC89%零拷贝DirectByteBuffer8.30无新生代晋升31%差距源于标准方式每包触发一次new byte[caplen]100 万次分配 ≈ 1.5GB 堆内存触发频繁 GC零拷贝复用同一块 native memoryJava 层只做指针传递。5.4 安全边界为什么这个技巧只在jnetpcap-src中可行因为 Maven jar 的 native 库是黑匣子你无法修改pcap_next_ex()调用时机getNativePacketDataAddress()方法根本不存在PcapPacket的buffer()方法返回的是byte[]无法获取 native 地址更致命的是官方 jar 的 native 层未导出pcap_t*句柄获取函数get_pcap_handle()是私有 API。只有当你掌控jnetpcap-src的每一个.c文件才能在pcap.c中安全暴露data指针并确保其生命周期与pcap_next_ex()语义一致。这正是源码包不可替代的价值——它不是工具而是你的网络数据平面的延伸。我坚持在每个新项目启动时花半天时间编译jnetpcap-src并跑通零拷贝 demo。不是为了炫技而是因为线上环境里一个OutOfMemoryError的代价远高于编译一次的半小时。当运维半夜打电话说“抓包服务又挂了”而你心里清楚那只是 GC 导致的假死你就能稳住呼吸打开终端敲下sudo jstat -gc pid—— 然后笑着告诉他“等我 push 一个 commit五分钟后恢复。”希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Python构建生产级AI知识库:从PDF解析到FAISS向量检索

Python构建生产级AI知识库:从PDF解析到FAISS向量检索

简介:这是一套轻量级AI知识库系统的Python全栈实现源码,面向Python初学者与中小型知识管理场景开发者,解决本地化部署、结构化文档存储与关键词检索等核心需求。资源共22个文件,含6个核心Python脚本(如run.py入口、ini…

2026/10/13 17:58:02 阅读更多 →
pm2加入任务失败?从日志到配置的完整排查指南

pm2加入任务失败?从日志到配置的完整排查指南

刚把项目部署到服务器,敲下那句熟悉的 pm2 start app.js ,结果终端毫不客气地吐出一行红色的报错,紧接着进程直接退出了。遇到过这种“用pm2加入任务失败”情况的同学应该不在少数,尤其当你切换服务器、换新环境或者迁移项目的时…

2026/10/12 15:32:50 阅读更多 →
华为eNSP配置入门:从设备选型到VLAN路由的避坑指南

华为eNSP配置入门:从设备选型到VLAN路由的避坑指南

简介:这份资源是面向网络初学者与备考华为认证人群的ENSP基础配置实操文档,围绕华为企业网络模拟平台展开,帮助读者在虚拟环境中完成设备配置与协议验证,解决缺少真机、难以反复练习的问题。压缩包内共1个docx文件,约6…

2026/10/13 19:42:18 阅读更多 →

最新新闻

三强版 Codex 一键部署包,本地桌面 AI 自动化全流程实操

三强版 Codex 一键部署包,本地桌面 AI 自动化全流程实操

🔍前言 本文介绍 Codex Harness 一键安装包的部署方案,无需解压,也无需繁琐的环境配置,新手也能快速上手。该方案同时支持 Windows 与 macOS 双平台,跟随向导几步即可完成安装、登录与模型密钥配置。文中完整演示了技…

2026/10/13 20:11:08 阅读更多 →
SpringBoot多环境日志配置:用logback-spring.xml+Profile实现环境隔离

SpringBoot多环境日志配置:用logback-spring.xml+Profile实现环境隔离

1. 为什么SpringBoot项目要把日志配置拆成多环境不管你信不信,我见过太多SpringBoot项目,日志配置就一个logback.xml躺在resources目录里,从入职第一周用到项目上线,开发环境一堆DEBUG刷屏没人管,生产环境出了问题想查…

2026/10/13 20:11:07 阅读更多 →
MATLAB中AES-256加解密实战:Java桥接与文件安全

MATLAB中AES-256加解密实战:Java桥接与文件安全

简介:这份资源面向学习密码学与MATLAB编程的读者,提供AES-256位加密算法在MATLAB 2012B环境下的完整实现代码,帮助理解对称加密的内部运作机制。压缩包共16个文件,约448KB,以13个m脚本为核心,涵盖密钥扩展、…

2026/10/13 20:11:07 阅读更多 →
C++结构体与结构体数组:从定义、内存布局到排序实践

C++结构体与结构体数组:从定义、内存布局到排序实践

如果你翻过C教材的目录,多半会在“结构体”这一章停几秒钟,然后想:这不就是把几个变量捆在一起吗?有什么好讲的。我工作之后才意识到,结构体恰恰是C里最容易被低估的基础设施,链表、树、图形控件的属性表、…

2026/10/13 20:11:07 阅读更多 →
Spring Boot JPA 实战指南:从实体映射到查询优化的避坑经验

Spring Boot JPA 实战指南:从实体映射到查询优化的避坑经验

1. 为什么我要认真聊聊 Spring Boot 里的 JPA做后端开发这些年,我接触过的持久层方案不算少。从最早手写 JDBC 拼 SQL,到后来用 MyBatis 写 XML 映射文件,再到 Spring Boot 项目里大量使用 JPA,每一种方案都有它适合的场景。但要说…

2026/10/13 20:11:07 阅读更多 →
Sufer 8.0英文版等值线图实战:从散点插值到批量出图的完整避坑指南

Sufer 8.0英文版等值线图实战:从散点插值到批量出图的完整避坑指南

简介:Surfer 8.0英文版是Golden Software公司推出的专业地形图绘制与三维建模软件,面向地质、环境科学、工程及地球科学领域的从业者与学习者,用于将离散数据转化为连续格网表面并生成专业图件。压缩包共234个文件,约12.41MB&…

2026/10/13 20:10:07 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →