本文转自:https://blog.csdn.net/l1028386804/article/details/53903557

在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来实现一些JAVA不能实现的功能,或者是一些第三方dll插件。通常的做法是将这些dll文件复制到 %JAVA_HOME%\jre\bin\ 文件夹或者 应用中间件(Tomcat|Weblogic)的bin目录下之后,在程序中才能正常使用。但是这个步骤在项目实施或移植时经常会被忘记,比较麻烦,所以就考虑能否在项目运行过程中动态加载,而不需要再手动复制这些文件。在网上找了很多资料,大部分的说法要么是手动复制,要么就是JAVA项目中的解决方法(不适用于JAVA Web项目),所以整理此资料,以供参考。

第一步 建立一个监听类
    建立监听类的作用是在应用中间件启动时自动执行加载程序。
    1)创建一个类实现ServletContextListener 接口
    2)实现contextInitialized方法
    3)在项目的web.xml 文件中配置此监听类

第二步 将dll文件所在的路径添加到系统环境java.library.path 中
    添加过程需要使用到反射机制来进行,不能使用System.setProperty()进行设置,设置了也无效。直接看代码:

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();
}
}

第三步 加载dll文件

接下来就可以写上下文初始化的方法了:

public void contextInitialized(ServletContextEvent arg0) {
//获取存放dll文件的绝对路径(假设将dll文件放在系统根目录下的WEB-INF文件夹中)
String path=arg0.getServletContext().getRealPath("WEB-INF");
//将此目录添加到系统环境变量中
addDirToPath(path);
//加载相应的dll文件,注意要将'\'替换为'/'
System.load(path.replaceAll("\\\\","/")+"/XXXX.dll");
}

第四步 重启启动应用中间件(Tomcat|Weblogic)

至此就可以在你的java程序中使用dll文件的方法了。

---------------------
作者:liuyazhuang
来源:CSDN
原文:https://blog.csdn.net/l1028386804/article/details/53903557
版权声明:本文为博主原创文章,转载请附上博文链接!

Java之——Web项目中DLL文件动态加载方法的更多相关文章

  1. vue项目中主要文件的加载顺序(index.html、App.vue、main.js)

    先后顺序: index.html > App.vue的export外的js代码 > main.js > App.vue的export里面的js代码 > Index.vue的ex ...

  2. vue项目中主要文件的加载顺序(index.html、main.js、App.vue)

    todo: https://www.cnblogs.com/xifengxiaoma/p/9493544.html https://www.cnblogs.com/stella1024/p/10563 ...

  3. (转)关于java和web项目中的相对路径问题

    原文:http://blog.csdn.net/yethyeth/article/details/1623283 关于java和web项目中的相对路径问题 分类: java 2007-05-23 22 ...

  4. Delphi静态加载DLL和动态加载DLL示例

    下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...

  5. C#遍历XML文件动态加载菜单

    通过遍历XML文件动态加载菜单,顺便利用WebBrowser控件实现一个简单的桌面浏览器 效果如下: 代码如下: XMLFile1.xml <?xml version="1.0&quo ...

  6. web.xml中配置启动时加载的servlet,load-on-starup

    web.xml中配置启动时加载的servlet,load-on-starup 使用servlet来初始化配置文件数据: 在servlet的配置当中,<load-on-startup>1&l ...

  7. xib文件的加载方法

    xib文件的加载方法 以UITableViewCell的cell为例 很多时候因为系统的cell无法满足我们的日常需求,我们都会自定义cell 因为cell的界面比较固定,所以通常都会选择用xib来描 ...

  8. Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

  9. android sax解析xml 文件 动态加载标题

    要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...

随机推荐

  1. gradlew 命令行 build 调试 构建错误 Manifest merger failed MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. JAVA中如何将一个json形式的字符串转为json对象或对象列表

    import java.util.*; import java.text.SimpleDateFormat; import org.json.JSONObject; import org.json.J ...

  3. WPF装饰元素

    Border: <Style TargetType="Border"> <Setter Property="CornerRadius" Val ...

  4. Javascript常用语法 (一)

    判断成员是否是一个函数: if (typeof options.sourceMapName === 'function') { mapNameGenerator = options.sourceMap ...

  5. struts笔记

    Struts视频笔记: Struts是一个开源的web框架,框架提高了程序的规范的同时也约束了程序员的自由 为什么会有struts: 因为我们队mvc理解的不同,可能造成不同公司写程序的时候,规范不统 ...

  6. Skyline开发4-IProject接口

    IProject接口可以访问工程设置和打开保存工程的基本方法. 属性 FileVersion:返回 ITEVersionInfo.表示当前运行的TerraExplorer的版本,可通过ITEVersi ...

  7. c数据库读写分离和负载均衡策略

    最近在学习数据库的读写分离和主从复制,采用的是一主多从策略,采用轮询的方式,读取从数据库的内容.但是,假如某一台从数据库宕机了,而客户端不知道,每次轮选到此从数据库,不都要报错?到网上查阅了资料,找到 ...

  8. 机器学习中,使用NMS对框取优

    一.NMS实现代码 # http://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/ import nu ...

  9. VB.NET版+三层实现登陆

    三层已经学了一些时间了,開始认为自己能够用C#敲代码了,就用C#写了一个实现登陆的,真正再用在机房中.还是认为非常吃力的,所以.决定用vb.net敲了.以下是我用vb.net实现的登陆.能够给大家做一 ...

  10. Grunt、Gulp和Webpack对比

    1.Grunt处理Sass转换成CSS过程 2.Gulp处理Sass转换成CSS过程 3.Webpack执行原理 4.区别 (1)grunt和gulp都类似于webapck的中的scripts,属于任 ...