java如何修改java.library.path并且不重启jvm也能生效
先说一下需求吧,
目前在用JCEF实现java程序桌面版包装,源码中需要加载编译好的几个dll文件,而这些文件的路径必然是根据程序安装的路径而变化的,这就需要在程序运行的时候,去动态修改java.library.path来实现dll文件的加载
最开始的时候,我想到了System.setProperty();但是不管怎么试,都没办法动态加载进来,后来google了一下,发现这个方法需要重启JVM才行,原因看下面这段代码:
if (sys_paths == null) {
usr_paths = initializePath("java.library.path");
sys_paths = initializePath("sun.boot.library.path");
}
这段代码在ClassLoader类,loadLibrary方法中,这段代码的意思很好理解,sys_paths为null的时候会去加载一次变量,也就是说JVM启动后就不可能再去加载,既然不能直接用System.setProperty();那就只能另寻他路,我开始在网上找资料,不难找到很多博客(原创或转载)提供了一种方法,代码如下:
private static void addLibraryDir(String libraryPath) throws Exception {
Field field = ClassLoader.class.getDeclaredField("usr_paths");
field.setAccessible(true);
String[] paths = (String[]) field.get(null);
for (int i = 0; i < paths.length; i++) {
if (libraryPath.equals(paths[i])) {
return;
}
}
String[] tmp = new String[paths.length + 1];
System.arraycopy(paths, 0, tmp, 0, paths.length);
tmp[paths.length] = libraryPath;
field.set(null, tmp);
}
我用这种方法,把我的路径加进去了,但是在实际加载的时候,仍然找不到,这就有点尴尬了,我怀疑是不是自己的代码出错了,还是加路径的位置不对,但是尝试了N久,该方法始终无法跑通,也许是小弟资质略差,如有幸有大神看到此处,还望指点迷津
既然此路不通,咱也不能在一棵树上吊死不是,另寻他路,英文蹩脚的我无奈实处必杀技,在google上开始搜索英文资料,google搜索 “java modify java.library.path at runtime” 没想到第一条搜索就解决了我的问题!!!!!!
changing-java-library-path-at-runtime
该博客的第一个方法,还是最上面那两行代码,还是那个位置,该博客博主的方法就是设置sys_paths为null,既然每次只有在null的时候会初始化,那你何不设置路径后,重新置为null,让他下次执行的时候继续初始化呢?年少的我还是有很多路要走啊,这么看似简单的想法,居然一直没有想到,惭愧...
借鉴该方法,最后代码如下:
private static void addLibraryDir(String libraryPath) throws Exception {
Field userPathsField = ClassLoader.class.getDeclaredField("usr_paths");
userPathsField.setAccessible(true);
String[] paths = (String[]) userPathsField.get(null);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < paths.length; i++) {
if (libraryPath.equals(paths[i])) {
continue;
}
sb.append(paths[i]).append(';');
}
sb.append(libraryPath);
System.setProperty("java.library.path", sb.toString());
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
}
好了,问题完美解决,心中一块石头落地,中午又可以多吃两块肉了,哈哈~~
该文章最新发表于CSDN博客,后为推广,在博客园发表一份,文章为原创兼翻译,转载请注明出处,谢谢!
java如何修改java.library.path并且不重启jvm也能生效的更多相关文章
- 怎样解决 no jzmq in java.library.path
1. 确保zmq的各种library有安装正确.检查方法:查看/usr/local/lib, 看里面有没有libjzmq.a, libjzmq.dylib, libzmq.a, libjzmq.dyl ...
- paip.-Djava.library.path -Djava.ext.dirs= 的区别
paip.-Djava.library.path -Djava.ext.dirs= 的区别 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- IDEA搭建ssm框架测试衍生出的问题The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Develop\jdk7\jdk1.7.0_79\bin;
最近玩起IDEA这开发工具,搭建ssm框架测试时,部署项目出现如下问题: 信息: The APR based Apache Tomcat Native library which allows opt ...
- Tomcat启动慢原因之二 he APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path
Tomcat启动时提示: 信息: The APR based Apache Tomcat Native library which allows optimal performance in prod ...
- Exception in thread "main" java.lang.UnsatisfiedLinkError: no awt in java.library.path:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no awt in java.library.path: 这是 ...
- The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path 问题解决记录
1.问题 启动Tomcat之后,在浏览器输入IP后显示503,查看catalina.log发现报错: 2.问题定位:缺少 tomcat-native library 就是说 缺少Tomcat Nati ...
- no leveldbjni64-1.8 in java.library.path
在抽取以太坊Java版本的Trie树部分时,遇到了一个问题: Exception in thread "main" java.lang.UnsatisfiedLinkError: ...
- no sigar-amd64-winnt.dll in java.library.path 错误
需要维护别人写的一个WEB项目,还原数据库,从SVN中检出源码,运行,提示如下错误: 5526 [localhost-startStop-1] DEBUG Sigar - no sigar-amd6 ...
- 关于Tomcat启动时报The APR based Apache Tomcat Native library which allows optimal performanc e in production environments was not found on the java.library.path
错误信息如下 八月 01, 2016 10:11:15 上午 org.apache.catalina.core.AprLifecycleListener initINFO: The APR based ...
随机推荐
- 代码阅读分析工具Understand 2.0试用
Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...
- 使用Python写Windows Service服务程序
1.背景 如果你想用Python开发Windows程序,并让其开机启动等,就必须写成windows的服务程序Windows Service,用Python来做这个事情必须要借助第三方模块pywin32 ...
- Asp.net 加载事件(转载)
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- web api与webservice(转)
webservice走HTTP协议和80端口而你说的api,用的协议和端口,是根据开发人员定义的 这么说吧,api类似于cs架构,需要同时开发客户端API和服务器端程序而WebService则类似于b ...
- Windowns 10打开此电脑缓慢问题的一种解决办法
上个月刚配的台式,i7 6700K + 16GB + PM961用起来爽得不行. 不过最近两天突然发现,打开"此电脑"总会卡住,窗口里面也不显示磁盘.地址栏缓慢刷新. 一般此类问题 ...
- 查看apache、linux、kernel、nginx等版本
查看apache版本 /usr/sbin/apachectl -v httpd -v 安装目录,使用apachectl -v 查看mysql版本 mysql –help | grep Distri ...
- VS2013 ViewData ViewBag Ajax等关键词报错(当前上下文不存在名称)而且不提示也点不出来,但是可以正常运行,
这个多数问题是因为 视图 的Web.config 内的配置问题 在Views文件夹下 有一个Web.config文件,把里面的版本号(System.Web.Mvc, Version=5.2.2.0) ...
- js数字位数太大导致参数精度丢失问题
最近遇到个比较奇怪的问题,js函数里传参,传一个位数比较大,打印arguments可以看到传过来的参数已经改变. 然后查了一下,发现确实是js精度丢失造成的.我的解决方法是将数字型改成字符型传输,这样 ...
- Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份
http://www.tektea.com/archives/2163.html. 在<Linux操作系统备份之一:使用LVM快照实现Linux操作系统数据的在线备份>文章中,我们介绍了使 ...
- paper 121 :matlab中imresize函数
转自:http://www.cnblogs.com/rong86/p/3558344.html matlab中函数imresize简介: 函数功能:该函数用于对图像做缩放处理. 调用格式: B = i ...