La guía paso a paso o código que verás en este artículo es la resolución más eficiente y efectiva que hallamos a tu duda o problema.
Solución:
Necesitaba cambiar la ruta dll para mis pruebas unitarias. Intenté el siguiente truco y funcionó:
System.setProperty( "java.library.path", "/path/to/libs" );
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
Para una explicación, consulte el enlace original.
- No existe una forma aprobada de cambiar la ruta de la biblioteca para una JVM en ejecución.
- No puede cargar una biblioteca nativa más de una vez… y no puede descargar una biblioteca nativa para poder cargarla nuevamente: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4171986
Según sus comentarios anteriores (particularmente, el comportamiento de la biblioteca de terceros), diría que su mejor opción es obtener la ruta de la biblioteca correcta cuando inicia la JVM.
Tenga en cuenta que hay una forma engañosa de cambiar la ruta de la biblioteca (consulte https://stackoverflow.com/a/24258955/139985), pero implica una reflexión desagradable y, según se informa, no funciona para todas las versiones de Java. Ciertamente, se basa en detalles de implementación privados no documentados de ClassLoader
que pudo cambiar de una versión a la siguiente.
Recientemente me encontré con este problema y usé OpenJDK donde se lanza una NullPointerException (como 0-0 mencionó la respuesta de Samil). Lo siguiente funciona en OpenJDK y debería trabajar con Oracle JDK también.
(Opción 1) Reemplazar java.library.path
System.setProperty("java.library.path", newPath);
Field field = ClassLoader.class.getDeclaredField("sys_paths");
field.setAccessible(true);
field.set(ClassLoader.getSystemClassLoader(), new String[]newPath);
(Opción 2) Agregar a java.library.path existente
String libPath = System.getProperty("java.library.path");
String newPath;
if (libPath == null || libPath.isEmpty())
newPath = path;
else
newPath = path + File.pathSeparator + libPath;
System.setProperty("java.library.path", newPath);
Field field = ClassLoader.class.getDeclaredField("sys_paths");
field.setAccessible(true);
// Create override for sys_paths
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
List newSysPaths = new ArrayList<>();
newSysPaths.add(path);
newSysPaths.addAll(Arrays.asList((String[])field.get(classLoader)));
field.set(classLoader, newSysPaths.toArray(new String[newSysPaths.size()]));