Opencv实现盲水印技术(二)——使用maven构建Java Web工程

来源:互联网 发布:浙江大学翁恺 c语言pat 编辑:程序博客网 时间:2024/05/22 01:47

前言

在本系列文章的第一篇文章中讲述了在普通Java工程中使用opencv构建应用程序,而在实际项目中,往往需要构建Java Web项目。本文应用了springmvc框架,使用maven构建工程,将应用部署到Tomcat容器中,对外提供Http接口或者其他协议接口,供其他系统调用。

构建Java Web

使用maveb构建Java Web工程,需要解决两个问题:
1、加载opencv的jar包,即opencv-300.jar文件;
2、由于opencv是C/C++写的,在windows下编译成了dll动态链接库,在linux下编译成了so动态库,因此部署到Tomcat容器中时,需要能够加载该动态库,只有这样,opencv-300.jar中封装的JNI接口,才能正确的调用。

问题一、使用maven加载本地opencv-300.jar文件

1、首先在WEB-INF目录下创建lib目录,然后将opencv-300.jar文件置于其中。目录结构见下图。


2、在pom文件中添加如下依赖。
<dependency>      <groupId>opencv-300.jar</groupId>      <artifactId>opencv-300.jar</artifactId>      <version>1.0</version>      <scope>system</scope>      <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/opencv-300.jar</systemPath>    </dependency>
注意此处添加的依赖必须要指明scope。scope为system时,表示需显式的提供包含依赖的jar包,maven不会再去Repository中查找该依赖。

问题二、加载opencv动态链接库

当然,你可以直接将opencv的动态库直接放到tomcat/bin下,这样Tomcat容器启动后会加载该库到jvm中,但是这样会增加运维成本,本文使用动态加载opencv库,当spring容器启动时,将opencv库加载到jvm中。
首先将opencv动态库放到wepapp目录下,即web工程的根目录,使用下面的函数,将opencv动态库所在的路径加载到环境变量中。
    private void addDirToPath(String s){        try {            //获取系统path变量对象            Field field=ClassLoader.class.getDeclaredField("sys_paths");            //设置此变量对象可访问            field.setAccessible(true);            //获取此变量对象的值            String[] path=(String[])field.get(null);            //创建字符串数组,在原来的数组长度上增加一个,用于存放增加的目录            String[] tem=new String[path.length+1];            //将原来的path变量复制到tem中            System.arraycopy(path,0,tem,0,path.length);            //将增加的目录存入新的变量数组中            tem[path.length]=s;            //将增加目录后的数组赋给path变量对象            field.set(null,tem);        } catch (Exception e) {            e.printStackTrace();        }    }
在上述函数中,首先使用反射获取到jvm的环境变量,然后将要增加的目录放到环境变量中。
然后使用@PostConstruct语法糖,在Spring容器启动的时候去执行加载opencv动态库的操作。
    @PostConstruct    public void init(){        //获取存放dll文件的绝对路径        String path = System.getProperty("riskArsenalWeb.root");        System.out.println("######## 路径为 : " + path + " ########");        //将此目录添加到系统环境变量中        addDirToPath(path);        //加载相应的dll文件,注意要将'\'替换为'/'        System.load(path.replaceAll("\\\\","/")+"/opencv_java300.dll");        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);        System.out.println("######## Opencv加载完毕 ########");    }
关于@PostConstruct的介绍,可以看我之前转载的关于IOC的一篇博文。
到此,Java Web工程构建完成。

小结

本文讲述了如何构建Java Web工程,动态加载opencv库,接下来的文章将对实现盲水印技术的算法进行介绍。
0 0
原创粉丝点击