Unable to load library cannot open shared object file: No such file or directory

今天在部署项目的时候,出现了这么一个问题:我对接的海康摄像机SDK在window下运行时没有问题的,但是部署到Linux环境下的时候,就抛了这么一个异常:Unable to load library '/opt/web/lib/libhcnetsdk.so': /opt/web/lib/libhcnetsdk.so: cannot open shared object file: No such file or directory;找不到Linux环境下需要的so文件。仔细一看报错信息才发现是为什么。

原因就是我在编写项目的时候,为了未来的部署问题,提前做好了一个工具类来判断当先项目的运行环境,根据运行环境来选择是使用dll文件还是so文件,代码如下:

osSelect类

public class osSelect {

    public static boolean isLinux() {
        return System.getProperty("os.name").toLowerCase().contains("linux");
    }

    public static boolean isWindows() {
        return System.getProperty("os.name").toLowerCase().contains("windows");
    }
}

具体业务层的判断方法

private static boolean createSDKInstance() {
        if (hcNetSDK == null) {
            synchronized (HCNetSDK.class) {
                String strDllPath = "";
                try {
                    if (osSelect.isWindows())
                        //win系统加载库路径
                        strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll";
                    else if (osSelect.isLinux())
                        //Linux系统加载库路径
                        strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
                    hcNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
                } catch (Exception ex) {
                    System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    return false;
                }
            }
        }
        return true;
    }

可以看到,无论是window还是linux环境下,加载库路径都是“user.dir”,也就是当前工程根目录,但是如果更具海康提供的linux环境下的部署方法去部署,如下:

Unable to load library cannot open shared object file: No such file or directory_第1张图片

这种方法把库文件加载到了/usr/lib目录下,这就和当初编写的项目根目录不一致;解决办法就是在你部署项目jar包的同级目录下加上一个lib文件夹,将库文件全部放入lib文件夹中,即可解决这个问题;

至于海康提供的第二种方法,之前我也略微做过一次尝试:

Unable to load library cannot open shared object file: No such file or directory_第2张图片

但是在执行soure命令的时候会提示缺少ssl证书库,如下图:

尝试过网上很多种解决办法,但是最终都无法解决,所以还是不建议大家使用这种方法,就按我上面第一种方法部署就好,比较简单方便,唯一要注意的就是库文件的存放路径,如果还是有什么问题的话可以私聊我一起来解决哦。

你可能感兴趣的:(java,linux)