Adding new paths for native libraries at runtime in Java
[This solution don't work with Java 10+]
It seems impossible without little hacking (i.e. accessing private fields of the ClassLoader class)
This blog provide 2 ways of doing it.
For the record, here is the short version.
Option 1: fully replace java.library.path with the new value)
public static void setLibraryPath(String path) throws Exception {
System.setProperty("java.library.path", path);
//set sys_paths to null so that java.library.path will be reevalueted next time it is needed
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
}
Option 2: add a new path to the current java.library.path
/**
* Adds the specified path to the java library path
*
* @param pathToAdd the path to add
* @throws Exception
*/
public static void addLibraryPath(String pathToAdd) throws Exception{
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
//get array of paths
final String[] paths = (String[])usrPathsField.get(null);
//check if the path to add is already present
for(String path : paths) {
if(path.equals(pathToAdd)) {
return;
}
}
//add the new path
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length-1] = pathToAdd;
usrPathsField.set(null, newPaths);
}
How can I configure java.library.path at runtime?
First option is to set java.library.path to different value
/**
* Sets the java library path to the specified path
*
* @param path the new library path
* @throws Exception
*/
public static void setLibraryPath(String path) throws Exception {
System.setProperty("java.library.path", path);
//set sys_paths to null
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
}
The second option is to append your path to java.library.path
/**
* Adds the specified path to the java library path
*
* @param pathToAdd the path to add
* @throws Exception
*/
public static void addLibraryPath(String pathToAdd) throws Exception{
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
//get array of paths
final String[] paths = (String[])usrPathsField.get(null);
//check if the path to add is already present
for(String path : paths) {
if(path.equals(pathToAdd)) {
return;
}
}
//add the new path
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length-1] = pathToAdd;
usrPathsField.set(null, newPaths);
}
Taken from fahd.blog
How to add native library to java.library.path with Eclipse launch (instead of overriding it)
Had forgotten this issue... I was actually asking with Eclipse, sorry for not stating that originally.
And the answer seems to be too simple (at least with 3.5; probably with older versions also):
Java run configuration's Arguments : VM arguments:
-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"
Must not forget the quotation marks, otherwise there are problems with spaces in PATH.
Java.library.path setting programmatically
No you can't. This property is a read only value. You can change it at JVM launchin time with:
-Djava.library.path=your_path
If you want to load a library from a specific location, you can use System.load(libraryPath) instead with the full path to the library.
How to set the java.library.path from Eclipse
Don't mess with the library path! Eclipse builds it itself!
Instead, go into the library settings for your projects and, for each jar/etc that requires a native library, expand it in the Libraries tab. In the tree view there, each library has items for source/javadoc and native library locations.
Specifically: select Project
, right click -> Properties / Java Build Path / Libraries tab, select a .jar, expand it, select Native library location, click Edit, folder chooser dialog will appear)
Messing with the library path on the command line should be your last ditch effort, because you might break something that is already properly set by eclipse.
Related Topics
Changing Java Platform on Which Netbeans Runs
Why Is Method Overloading and Overriding Needed in Java
Differencebetween String and Stringbuffer in Java
Jackson - How to Process (Deserialize) Nested JSON
Why Are Variables Declared with Their Interface Name in Java
Any Character Including Newline - Java Regex
Spring Boot Actuator Application Won't Start on Ubuntu Vps
Find Maximum, Minimum, Sum and Average of a List in Java 8
How to Retrieve a List of Available/Installed Fonts in Android
Problems with Local Variable Scope. How to Solve It
Steganography in Lossy Compression (Java)
Org.Openqa.Selenium.Webdriverexception: Unknown Error: Call Function Result Missing 'Value'
How to Add New Methods to the String Class in Java
Java Swingworker Thread to Update Main Gui