JavaWeb项目中dll文件动态加载方法解析(详细步骤)

相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢。今天就给大家带来一篇JAVA Web项目中DLL/SO文件动态加载方法的文章。

在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文件的方法了。

以上就是本文关于JavaWeb项目中dll文件动态加载方法的全部内容,希望对大家有所帮助。

(0)

相关推荐

  • Javaweb项目session超时解决方案

    在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的.Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了. 0.需求 需要对所有的/web/**请求进行登录拦截,Session超时时跳转到登录页面. 1.引入 一般来说,在项目使用中都会配置Session超时时间,如果不配置,则默认值为30分钟,

  • JavaWeb Servlet中url-pattern的使用

    JavaWeb Servlet中url-pattern的使用 1.Sevlet和Filter的url-pattern相关说明 一个页面请求根据url-pattern只匹配一个最佳的Servlet,而根据web.xml的filter-mapping标签的先后顺序,将满足要求的一个或者多个过滤器生成一个FilterChain 2.url-pattern配置 配置web.xml文件,用于定义映射的含义: (1)."/"开头-->路径映射         (2)."*.do&q

  • web前端超出两行用省略号表示的实现方法

    web前端超出两行用省略号表示的实现方法 HTML <span class="GW_bod0112211"> 吐鲁番特级无炳黑加仑葡萄干500g包邮无籽吐鲁番特级无炳黑加仑葡萄干500g包邮无籽吐鲁番特级无炳黑加仑葡萄干500g包邮无籽,超大孕妇零食 </span> CSS span{ height: 40px; line-height: 20px; width: 300px; display: -webkit-box; -webkit-line-clamp:2

  • Javaweb使用cors完成跨域ajax数据交互

    跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告. cors 全称:Cross-Origin Resource Sharing 中文意思:跨域资源共享 它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而

  • JavaWeb Servlet中Filter过滤器的详解

    JavaWeb Servlet中Filter过滤器的详解 1.简述 Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制.过滤敏感词汇.压缩响应信息).Filter能够对Servlet容器的请求和响应进行检查和修改,其本身不能生成请求request和响应response,只提供过滤作用(Servlet被调用之前检查Request对象修改其相关信息,Servlet被调用后检查Response修改其相关信息),Filter对象常驻服务器. 2.Lifecyc

  • Web技术实现移动监测的介绍

    Web技术实现移动监测的介绍 由上述引用语句可得出"移动监测"需要以下要素: 一个拥有摄像头的计算机用于判断移动的算法移动后的处理 注:本文涉及的所有案例均基于 PC/Mac 较新版本的 Chrome / Firefox 浏览器,部分案例需配合摄像头完成,所有截图均保存在本地. 对方不想和你说话,并向你扔来一个链接: 体验链接>> 综合案例 该案例有以下两个功能: 拍好 POST 后的 1 秒会进行拍照静止 1 秒后音乐会停止,产生移动会恢复播放状态 上述案例也许并不能直接

  • JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO文件动态加载方法的文章. 在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来实现一些JAVA不能实现的功能,或者是一些第三方dll插件.通常的做法是将这些dll文件复制到 %JAVA_HOME%\jre\bin\ 文件夹或者 应用中间件(Tomcat|Weblogic)的bin

  • vue中img src 动态加载本地json的图片路径写法

    目录: 注意:本地json文件和json文件里的图片地址都必须写在static 静态文件夹里:否则json文件里的url地址找不到. major_info.json文件里的图片路径写法 页面通过v-bind的方式加载: PS:vue中图片src路径赋值 vue中引入static文件夹中图片,本以为src中直接写入图片所在路径即可,结果发现图片无法显示,控制台报404错误,图片无法找到.网上找到解决方案,在此mark一下,以便以后查询. 图片src路径动态赋值 <img class="thu

  • 理解Javascript文件动态加载

    Javascript文件动态加载一直是比较困扰的一件事情,像网络上传的比较常见的做法: function loadjs(fileurl){ var sct = document.createElement("script"); sct.src = fileurl; document.head.appendChild(sct); } 然后我们来测试一下结果: <html> <head> <link rel="stylesheet" typ

  • 常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数

    为了方便资源管理和提升工作效率,常用的js和css文件的加载应该放在一个统一文件里面完成,也方便后续的资源维护.所以我用js写了以下方法,存放在"sourceController.js"文件内. function sourceController(){ var root = ""; var cssCount = 0; // css加载计数器 var jsCount = 0; // js加载计数器 this.callfunc = null; // 回调函数 this.

  • javaWeb项目部署到阿里云服务Linux系统的详细步骤

    目录 项目部署到阿里云Linux系统 1.在虚拟机中创建一个指定安装软件的目录 2.安装项目部署的java1.8环境 2.1.上传文件 2.2.解压文件 1.运行前置目录查看是否有安装的jdk 2.运行命令进行解压并删除原来文件 2.3.配置JDK环境变量 3.RPM安装MySQL8.0.29数据库 3.1.官网下载地址 3.2.上传到Linux系统目录 1.解压文件 2.查看解压后的文件 3.3.执行安装操作 1.进行安装install 2.删除mariadb 3.执行安装rpm安装包(有先后

  • Android 中动态加载.jar的实现步骤

    首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code 才可以.当然,dx 工具转了之后,jar 包里面就不 是 .class 文件了,而是 .dex 文件. 第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用.要动态加载其它类,

  • 浅谈vue中使用图片懒加载vue-lazyload插件详细指南

    在vue中使用图片懒加载详细指南,分享给大家.具体如下: 说明 当网络请求比较慢的时候,提前给这张图片添加一个像素比较低的占位图片,不至于堆叠在一块,或显示大片空白,让用户体验更好一点. 使用方式 使用vue的 vue-lazyload 插件 插件地址:https://www.npmjs.com/package/vue-lazyload 案例 demo: 懒加载案例demo Installation 安装方式 npm $ npm i vue-lazyload -D CDN CDN: https:

  • Spring Boot集成Shiro实现动态加载权限的完整步骤

    一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .uri 权限后,后端动态分配权限,用户无需在页面重新登录才能获取最新权限,一切权限动态加载,灵活配置 基本环境 spring-boot 2.1.7 mybatis-plus 2.1.0 mysql 5.7.24 redis 5.0.5 温馨小提示:案例demo源码附文章末尾,有需要的小伙伴们可参考哦 ~

  • 利用java读取web项目中json文件为map集合方法示例

    前言 本文主要介绍了关于java读取web项目中json文件为map集合的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实例介绍 假设当前项目web目录(/resource/test.json)下有一json文件如下: [ { "path": "content_111", "title": "文章1", "imgUrl": "../../../libs/img/ppt

  • vue之项目中如何封装loading加载效果

    目录 vue封装loading加载效果 Loading.vue loading.js main.js中导入并使用 项目中使用Loading加载 总结 vue封装loading加载效果 使用两个文件,vue文件是loading加载效果页面,JS文件用于main.js中use,供全局使用 Loading.vue <template> <div v-if="show" class="loading-container"> <div class

随机推荐