Aunque no está bien documentado, la propiedad del sistema java.library.path
es una propiedad de "solo lectura" en lo que respecta al método System.loadLibrary()
. Esto es reported bug pero Sun lo cerró en lugar de solucionarlo. El problema es que el ClassLoader de la JVM lee esta propiedad una vez en el inicio y luego la almacena en la memoria caché, lo que no nos permite cambiarla programáticamente después. La línea System.setProperty("java.library.path", anyVal);
no tendrá ningún efecto excepto para las llamadas al método System.getProperty()
.
Afortunadamente, alguien posted a workaround on the Sun forums. Desafortunadamente, ese enlace ya no funciona pero encontré the code on another source. Este es el código que puede utilizar para evitar no poder establecer la propiedad java.library.path
sistema:
public static void addDir(String s) throws IOException {
try {
// This enables the java.library.path to be modified at runtime
// From a Sun engineer at http://forums.sun.com/thread.jspa?threadID=707176
//
Field field = ClassLoader.class.getDeclaredField("usr_paths");
field.setAccessible(true);
String[] paths = (String[])field.get(null);
for (int i = 0; i < paths.length; i++) {
if (s.equals(paths[i])) {
return;
}
}
String[] tmp = new String[paths.length+1];
System.arraycopy(paths,0,tmp,0,paths.length);
tmp[paths.length] = s;
field.set(null,tmp);
System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + s);
} catch (IllegalAccessException e) {
throw new IOException("Failed to get permissions to set library path");
} catch (NoSuchFieldException e) {
throw new IOException("Failed to get field handle to set library path");
}
}
ADVERTENCIA: Esto puede no funcionar en todas las plataformas y/o JVM.
'java.library.path' se refiere al directorio * * no es una * archivo * – jacktrades