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

Pra*_*ngh 3 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Maven 依赖

<dependency>
            <groupId>nu.pattern</groupId>
            <artifactId>opencv</artifactId>
            <version>2.4.9-7</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

请帮助我,加载 opencv 或其他本机库的好做法是什么?

11t*_*ion 6

在静态块中加载本机库是一种很好的做法。但是,有几件事需要牢记。

一个类只能加载一次(偶尔会留下相应的类加载器垃圾收集,这可能会卸载它提供重新加载的机会),因此如果库加载出现问题,您可能必须重新启动 JVM 或重新加载此类以某种方式手动。

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

但是,如果库是在静态块以外的其他地方加载的,则可以在服务或 servlet HTTP 方法的下一次调用中加载。如果库已经加载,多次调用 System.loadLibrary() 不会做任何事情,所以没有副作用。

综上所述,在我看来,在静态块中加载本机库是要走的路。