在静态块中加载库是正确的方法吗?

时间:2015-11-18 07:13:47

标签: java opencv spring-boot

我通过maven依赖在我的应用程序中使用opencv库。我在应用程序启动时在静态块中加载opencv。不过,我在开发环境中工作并且工作正常。但是我想问一下,这是在静态块中加载opencv的正确方法吗?

加载opencv

@SpringBootApplication
@EnableScheduling
public class SamepinchApplication extends SpringBootServletInitializer{

static {
        try{
            nu.pattern.OpenCV.loadShared();
            System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
        }catch(Exception exception){
            System.out.println("Open CV Library could not load due to " + exception.getCause());
        }
    }

 public static void main(String[] args) {
        SpringApplication.run(SamepinchApplication.class, args);
    }

}

Maven依赖

<dependency>
            <groupId>nu.pattern</groupId>
            <artifactId>opencv</artifactId>
            <version>2.4.9-7</version>
        </dependency>

请帮帮我,加载opencv或其他本地库的好习惯是什么?

1 个答案:

答案 0 :(得分:3)

在静态块中加载本机库是一种很好的做法。但是要记住一些事情。

一个类只能被加载一次(只留下相应的Classloader垃圾收集,可以卸载它,提供重新加载的机会),所以如果库加载出错,你可能不得不重启你的JVM或者以某种方式手动重新加载这个类。

例如,如果您在REST服务或Servlet的静态块中加载库,并且由于某种原因未加载库,则必须重新部署应用程序或重新启动应用程序服务器以重新加载类以运行静态块再次进行下一次尝试。

但是,如果库被加载到静态块以外的某个地方,则可以在下次调用服务或servlet HTTP方法时加载它。 如果已加载库,则多次调用System.loadLibrary()不会执行任何操作,因此没有副作用。

所有这一切,在我看来,在静态块中加载本机库是可行的方法。