项目目前需要加载几个外部的dll文件,但是每次启动都要手动设置jvm参数就很麻烦,于是就想找能够在运行时动态修改java.library.path的方法,中间遇到的坑就就不说了,直接上方法
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);
//修改java.library.path
System.setProperty("java.library.path", sb.toString());
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
//修改完成后重新将sys_paths置为null
sysPathsField.set(null, null);
}
方法还是很简单,利用java的反射机制去设置java.library.path,设置完成之后需要将sys_paths属性置为null。原因见下面的代码,因为sys_paths为null的时候会去加载一次变量,也就是说JVM启动后就不可能再去加载变量,类在加载的时候jvm就启动了,这个时候再去修改变量是不会生效的。
if (sys_paths == null) {
usr_paths = initializePath("java.library.path");
sys_paths = initializePath("sun.boot.library.path");
}
一个小知识点mark一下QAQ