How to load AttachProvider (attach.dll) dynamically

dll, java

Solution

The API you are using is using loadLibrary(String). It seems you cannot successfully pre-empt (cause it to succeed) this by invoking the more explicit load(String) first.

So you must to specify the path in `java.library.path`.

That System property is set once early in JVM lifecycle and is not modifiable by standard means.

So the conventional solution will be to pass an appropriate `java.library.path` when you launch the JVM.

Alternatively, you could look into the hacks to change this property after JVM startup using reflection. I have not tried any of these.

For example, see here:

System.setProperty( "java.library.path", "/path/to/libs" );

Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );

BTW, I would recommend pre-pending your custom path to the existing path, rather than replacing it.

Problem

I'm using `com.sun.tools.attach` from jdk's `tools.jar` and it need an specified `java.library.path` env pointing to `attach.dll` at startup to properly instatiate provider such as `WindowsAttachProvider`. For some reasons I need to dynamic loading one of bundled `attach.dll`. I'm try to use some like this: ``` 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(); } ``` If I run this out of jdk (in normall jre) it's report to me: ``` 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(... ``` How to install attach provider without specifying `-Djava.library.path` to point `attach.dll` at startup?

Original source