先说一下需求吧,

目前在用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也能生效的更多相关文章

  1. 怎样解决 no jzmq in java.library.path

    1. 确保zmq的各种library有安装正确.检查方法:查看/usr/local/lib, 看里面有没有libjzmq.a, libjzmq.dylib, libzmq.a, libjzmq.dyl ...

  2. paip.-Djava.library.path -Djava.ext.dirs= 的区别

    paip.-Djava.library.path  -Djava.ext.dirs= 的区别 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专 ...

  3. 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 ...

  4. 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 ...

  5. 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: 这是 ...

  6. 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 ...

  7. no leveldbjni64-1.8 in java.library.path

    在抽取以太坊Java版本的Trie树部分时,遇到了一个问题: Exception in thread "main" java.lang.UnsatisfiedLinkError: ...

  8. no sigar-amd64-winnt.dll in java.library.path 错误

    需要维护别人写的一个WEB项目,还原数据库,从SVN中检出源码,运行,提示如下错误: 5526 [localhost-startStop-1] DEBUG Sigar  - no sigar-amd6 ...

  9. 关于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 ...

随机推荐

  1. CDN服务技术架构图

    前言 在博文中 解读大型网站的演变过程  浅谈 举家搬迁静态文件到CDN 博文中都有涉及CDN,这次我们来详细讲解下CDN的架构 简介 CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器 ...

  2. svn 服务器搭建

    http://www.cnblogs.com/wrmfw/archive/2011/09/08/2170465.html 一,安装必须的软件包. $ apt-get install subversio ...

  3. SSD Trim Support -- 保护 SSD

    今天同事告诉我,换了 ssd 之后需要做以下配置能使 ssd 寿命更长.原理是配置系统定期清理和回收 ssd 的资源. 最终效果: 步骤: 1.下载 trim enabler: https://gis ...

  4. 移动端rem 适配

    在 index.html 中添加如下代码 <script> let html = document.documentElement; window.rem = html.getBoundi ...

  5. Webstorm功能详解及插件推荐

    Web前端开发神器--Webstorm不用多介绍,强大的智能提示只是它的一个功能特性,它还具有许多有用的特性,比如版本控制.本地历史.即时模板等.Webstorm还内置了对 SASS.NodeJS.C ...

  6. xtrabackup备份rds记录

    在执行最后一步时 mysqld_safe --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mys ...

  7. 用android去写一个小程序

    前言: 软工的一个小作业:实现"黄金分割小游戏", 需要结对编程,队友:陈乐云    共用时两天. 早期思路设计: 采用键值对的形式,以Map作为存储结构.优点:能够将数据与用户对 ...

  8. MultiWiiWinGUI 汉化版

    已经基本汉化完毕 下载

  9. servlet内置对象

    request                请求对象       类型javax.servlet.ServletRequest   作用域Request response              ...

  10. Java Thread wait, notify and notifyAll Example

    Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...