Как загрузить AttachProvider (attach.dll) динамически

Я использую com.sun.tools.attach из jdk tools.jar и ему нужно указать java.library.path env, указывающий 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 (в normall 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 указать -Djava.library.path при запуске?

Используемый вами API использует loadLibrary (String) . Кажется, вы не можете успешно предварительно убрать (заставить его добиться успеха), вызвав сначала более явную нагрузку (String) .

Поэтому вы должны указать путь в java.library.path .

Это свойство системы устанавливается как можно раньше в JVM-жизненном цикле и не модифицируется стандартными средствами.

Таким образом, обычным решением будет передача соответствующего java.library.path при запуске JVM.

Кроме того, вы можете изучить хаки, чтобы изменить это свойство после запуска JVM с использованием отражения. Я не пробовал ни одного из них.

Например, см. Здесь :

 System.setProperty( "java.library.path", "/path/to/libs" ); Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" ); fieldSysPath.setAccessible( true ); fieldSysPath.set( null, null ); 

Кстати, я бы порекомендовал предусмотреть ваш собственный путь к существующему пути, а не заменять его.