È possibile aggiungere un nuovo percorso per le librerie native in fase di runtime ?. (Invece di avviare Java con la proprietà java.library.path), quindi una chiamata a System.loadLibrary(nativeLibraryName)
includerà quel percorso quando si cerca di trovare nativeLibraryName
. È possibile o questi percorsi vengono congelati dopo l'avvio della JVM?Aggiunta di nuovi percorsi per le librerie native in fase di esecuzione in Java
risposta
Sembra impossibile senza poco di hacking (vale a dire l'accesso ai campi privati della classe ClassLoader)
Questo blog offrono 2 modi per farlo.
Per la cronaca, ecco la versione breve.
Opzione 1: sostituire completamente java.library.path con il nuovo valore)
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);
}
Opzione 2: aggiungere un nuovo percorso per la corrente 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);
}
davvero un bel compromesso :) grazie per averlo pubblicato. Non dovrebbe essere così hacky, probabilmente è difficile cambiare quel percorso per motivi di sicurezza, non è sicuro. Eviterò di farlo ma è bello sapere che esiste. – Sergio
La classe Field menzionata è: 'import java.lang.reflect.Field;' – Troyseph
Java9 registra una "operazione di accesso illecito illegale". – Stefan
- 1. Aggiunta di annotazioni Java in fase di esecuzione
- 2. Aggiunta di file a classpath java in fase di esecuzione
- 3. Aggiungi percorso cammello in fase di esecuzione in Java
- 4. Aggiunta personalizzato: nuovi percorsi utilizzando Rails 3 di routing
- 5. Aggiunta di nuovi utenti in Spring Security
- 6. Esecuzione del codice java compilato in fase di esecuzione
- 7. Compilazione classe Groovy in fase di esecuzione in Java
- 8. Aggiunta dinamica di nuovi nodi in Cassandra
- 9. Come cambiare lingua in fase di esecuzione in java swing
- 10. Dipendenze Maven2 e librerie native
- 11. Caricamento giare in fase di esecuzione
- 12. Modifica implementazione/classe in fase di esecuzione
- 13. Aggiunta librerie in/usr per Xcode
- 14. cartella Rimuovere da Java classpath in fase di esecuzione
- 15. Aggiunta di jar a un plug-in Eclipse in fase di esecuzione
- 16. Aumenta disposizione PySpark in fase di esecuzione
- 17. Aggiunta di un bordo a un gruppo in fase di esecuzione in flex
- 18. MySQLNonTransientConnectionException nel programma JDBC in fase di esecuzione
- 19. percorsi relativi per librerie condivise
- 20. Modifiche al vtable in fase di esecuzione
- 21. Ottieni binding IIS in fase di esecuzione
- 22. È possibile guardare le variabili in fase di esecuzione?
- 23. Cancellazione dell'eco acustico in Flash/Flex utilizzando le librerie native
- 24. Rileva versione Python in fase di esecuzione
- 25. Sostituisci bean in fase di esecuzione
- 26. Ciclo attraverso tutte le proprietà dell'oggetto in fase di esecuzione
- 27. scegliere una monade in fase di esecuzione
- 28. Modifica proprietà log4j in fase di esecuzione
- 29. Gradle Android, librerie native per diverse architetture
- 30. Compilazione sass/scss di ASP.NET in fase di esecuzione e in fase di compilazione?
http://stackoverflow.com/questions/2899804/setting-classpath-during-runtime –