Windows下多次同时执行Java JAR时无法加载OpenCV库
OpenCV DLL加载失败问题(Windows多Java进程场景)
问题现象
在Windows主机上同时启动多个已构建的Java JAR进程时,除其中一个进程能正常运行外,其余进程均触发UnsatisfiedLinkError异常,报错信息如下:
Caused by: java.lang.UnsatisfiedLinkError: Can't load library: C:\Users\xxx\AppData\Local\Temp\opencv_openpnp15738695246714582909 u\pattern\opencv\windows\x86_64\opencv_java320.dll
若依次启动进程则无此问题。
环境信息
- Java版本:17
- OpenCV依赖:Maven的
org.openpnp.opencv:4.9.0(使用3.2.0版本时同样出现该错误) - 加载方式:通过静态代码块调用
nu.pattern.OpenCV.loadLocally()加载库:
static { nu.pattern.OpenCV.loadLocally(); }
问题根源分析
查看OpenCV源码后发现,Windows系统下loadLocally()方法启动时会执行删除旧临时实例的逻辑:
if (OS.WINDOWS.equals(os)) { destination = new TemporaryDirectory().deleteOldInstancesOnStart().getPath().resolve("./" + location).normalize(); } else { destination = new TemporaryDirectory().markDeleteOnExit().getPath().resolve("./" + location).normalize(); }
这会导致先启动的进程的临时DLL文件被后启动的进程删除,进而触发加载失败;报错后临时文件夹依然存在,但DLL文件已被删除。
当前临时方案的局限
手动将classpath中的DLL复制到临时目录并调用System.load()可解决加载问题,但存在以下缺陷:
- Windows系统下,DLL文件被进程锁定,无法通过关闭钩子自动删除,会持续占用磁盘空间;
- Linux系统虽可通过关闭钩子删除,但跨平台一致性无法保证。
寻求解决方案
需要一种能兼顾Windows多进程场景下DLL正常加载,同时避免磁盘空间占用的合理方案。
内容的提问来源于stack exchange,提问作者Florian Gubler
相关产品推荐
相关产品推荐

