场景:
我有一个必须使用 .dll 的小程序。 该 .dll 必须存在于 PATH 中。 为了通过小程序获取 PATH 上的 .dll,运行浏览器的用户必须具有管理权限(通常通过右键单击图标以管理员身份运行...来完成)。
问题:
我想消除必须获得管理特权的需要。
坏主意 我想让小程序将文件保存在用户主目录中的某个位置。我想将该路径添加到 PATH 中。显然,可以通过以下方式完成:
System.setProperty("java.library.path", <new path>);
try {
// this forces JVM to reload "java.library.path" property
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
} catch (Exception e) {
e.printStackTrace();
init_failure = true;
}
问题
强制 JVM 执行此操作是一个坏主意吗?这是使用未记录的方法/只是简单的黑客行为吗?
其他位
因为这是一个小程序,所以我无法通过 -D 选项指定 java.library.path,正确吗?
此代码位于 Intranet 中。不适合普通的互联网硬汉。
最佳答案
field.setAccessible( true ) 总是很hacky并且没有文档记录。它改变了私有(private)领域!也许您很幸运,它适用于所有受支持的 JVM,并且在将来任何时候都不会改变。
我还担心,如果在您更改路径之前,JVM 由于某种原因在之前的 java.library.path 中找到并加载了您的 dll 版本,会发生什么情况。我想它会保留加载的版本,而不加载新版本。
如果您在受控环境中工作,您可能会忽略这些问题,但我鼓励您寻找其他解决方案。例如。告诉用户使用简单的安装程序远程安装 dll。
关于java - 强制 JVM 重新加载 "java.library.path"是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8838113/