You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:35:57