Java之——Web项目中DLL文件动态加载方法
本文转自: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文件动态加载方法的更多相关文章
- vue项目中主要文件的加载顺序(index.html、App.vue、main.js)
先后顺序: index.html > App.vue的export外的js代码 > main.js > App.vue的export里面的js代码 > Index.vue的ex ...
- vue项目中主要文件的加载顺序(index.html、main.js、App.vue)
todo: https://www.cnblogs.com/xifengxiaoma/p/9493544.html https://www.cnblogs.com/stella1024/p/10563 ...
- (转)关于java和web项目中的相对路径问题
原文:http://blog.csdn.net/yethyeth/article/details/1623283 关于java和web项目中的相对路径问题 分类: java 2007-05-23 22 ...
- Delphi静态加载DLL和动态加载DLL示例
下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...
- C#遍历XML文件动态加载菜单
通过遍历XML文件动态加载菜单,顺便利用WebBrowser控件实现一个简单的桌面浏览器 效果如下: 代码如下: XMLFile1.xml <?xml version="1.0&quo ...
- web.xml中配置启动时加载的servlet,load-on-starup
web.xml中配置启动时加载的servlet,load-on-starup 使用servlet来初始化配置文件数据: 在servlet的配置当中,<load-on-startup>1&l ...
- xib文件的加载方法
xib文件的加载方法 以UITableViewCell的cell为例 很多时候因为系统的cell无法满足我们的日常需求,我们都会自定义cell 因为cell的界面比较固定,所以通常都会选择用xib来描 ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
- android sax解析xml 文件 动态加载标题
要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...
随机推荐
- 【Spark】开发Spark选择Java还是Scala?
Spark-Java-Scala-哪种语言 spark java 支持_百度搜索 (1 封私信)Spark 中用 Scala 和 java 开发有什么区别? - 知乎 (1 封私信)Spark平台下, ...
- 【html5】HTML5中canvas怎样画虚线
在canvas API中,我们发现仅仅提供了画实线的方法实现,并没有虚线的相关方法,那么怎样实现画虚线呢? 现实中,虚线是由一小段小段的实线线段组成,那么仅仅要我们通过画出等长度的线段就能够组成我们想 ...
- 与IE的战斗
对第2版的改进,工作量几乎都在UI上,不断的写css,写js,还别说,总体挺愉快的.特别是把360浏览器用顺了之后,烦人的无法刷新问题也不能困扰我了,改了js或者css文件的话,只要清除一下缓存,就可 ...
- 企业防火墙之iptables
1.1 企业中安全优化配置原则 尽可能不给服务器配置外网ip ,可以通过代理转发或者通过防火墙映射.并发不是特别大情况有外网ip,可以开启防火墙服务. 大并发的情况,不能开iptables,影响性能, ...
- FIS前端集成解决方案
FIS前端集成解决方案-文档结构 什么是FIS 部署FIS FIS基本使用 模块定义 加载方式 调用Tangram 2.0 FIS开发实例 --附件下载-- 什么是FIS FIS提供了一套贯穿开发流程 ...
- 微信小程序 - 下拉刷新(非组件)
详情见示例:refresh
- 开发JAVA9以上的项目时,出现ClassNotFoundException: javax.xml.bind.JAXBException的解决方法
一.问题描述: 开发JAVA9以上的项目时,出现ClassNotFoundException: javax.xml.bind.JAXBException的解决方法 二.问题样例 三.解决方案 打开mv ...
- C#中使用多款LevelDB.Net封装测试性能
一.使用http://www.nuget.org/packages/LevelDB.NET 测试 1.新建项目,并Nuget引入库: 2.写代码 using LevelDB; using System ...
- 1051: 手机(MOBILE)
#include <iostream> #include <iomanip> #include <cstdlib> #include <string> ...
- Shell 字符串分割
入门级别 入门级别:类似1,2,3,4,5这样的字符串 #!/bin/bash var="1,2,3,4,5" var=${var//,/ } for i in $var; do ...