我在用着com.sun.tools.attach
来自jdk的tools.jar
并且它需要一个指定的java.library.path
环境指向attach.dll
在启动时正确实例化提供程序,例如WindowsAttachProvider
。由于某些原因,我需要动态加载捆绑包之一attach.dll
。我尝试使用这样的一些:
public static void main(String[] args) throws Exception {
Path bin = Paths.get(System.getProperty("user.dir"),"bin").toAbsolutePath();
switch (System.getProperty("os.arch")) {
case "amd64":
bin = bin.resolve("win64");
break;
default:
bin = bin.resolve("win32");
}
// Dynamic setting of java.library.path only seems not sufficient
System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + bin.toString());
// So I try to manual loading attach.dll. This is not sufficient too.
System.load(bin.resolve("attach.dll").toString());
// I'm using com.sun.tools.attach in my app
new myApp();
}
如果我从 jdk(在正常的 jre 中)运行它,它会向我报告:
java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider:
Provider sun.tools.attach.WindowsAttachProvider could not be instantiated:
java.lang.UnsatisfiedLinkError: no attach in java.library.path
Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException:
no providers installed
at com.sun.tools.attach.VirtualMachine.attach(...
如何在不指定的情况下安装附加提供程序-Djava.library.path
指向attach.dll
在启动时?
您正在使用的 API 正在使用加载库(字符串) http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#loadLibrary%28java.lang.String%29。看来您无法通过调用更明确的方法成功地抢先(使其成功)负载(字符串) http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#load%28java.lang.String%29 first.
所以你必须指定路径java.library.path
.
该系统属性在 JVM 生命周期的早期设置一次,并且不能通过标准方式进行修改。
所以传统的解决方案是通过一个适当的java.library.path
当你启动 JVM 时。
或者,您可以研究在 JVM 启动后使用反射更改此属性的技巧。我还没有尝试过这些。
例如,参见here http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/:
System.setProperty( "java.library.path", "/path/to/libs" );
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
顺便说一句,我建议将您的自定义路径预先添加到现有路径中,而不是替换它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)