segunda-feira, 13 de agosto de 2007

Alterando variável java.library.path em tempo de execução

Olá a todos,

Estou postando aqui um trecho de código que eu e dois colegas (Israel e Gustavo) encontramos para solucionar um problema bem simples. Estavamos desenvolvendo uma ferramenta que utilizava o framework JOGL, e além do jogl.jar tinhamos que carregar uma dll também do jogl. Para carregar esta dll tinhamos então que colocar elas, ou no path do sistema operacional (nem um pouco indicado pois no nosso caso nem teriamos como gravar arquivos nos diretórios do C:/... por motivos de falta de permissão) apontada pela variável java.library.path, ou colocar na raiz da aplicação. Mas queríamos que as dlls ficassem dentro da pasta lib do nosso projeto. Para resolver isso procuramos na web uma forma de alterar a variável java.library.path somente em tempo de execução e ao finalizar o aplicativo esta variável seria reinicializada com o valor anterior.

A idéia é simples e o código também:

try {
Class clazz = ClassLoader.class;
Field field = clazz.getDeclaredField("sys_paths");

boolean accessible = field.isAccessible();
if (!accessible)
field.setAccessible(true);
Object original = field.get(clazz);

field.set(clazz, null);
try {
System.setProperty("java.library.path", System.getProperty("java.library.path") + ";" + new File("").getAbsolutePath() + File.separator + "lib");
System.loadLibrary("jogl");
}
finally {
field.set(clazz, original);
field.setAccessible(accessible);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

Prometo que os próximos códigos irei postar em um Pastbin, mas ainda não achei nenhum decente...

[]'s

3 comentários:

gamargos disse...

Olá, estou com uma dúvida neste assunto, estou tentando setar o LibraryPath em tempo de execução mas apesar de eu ler o valor do library path antes de chamar o loadLibrary e ele esta com o valor que eu forneci, a lib não esta sendo encontrada, mesmo aparentemente tudo parecendo certo.
Gostaria de intender por que razão você faz todo esse processo de pegar um Field da classe e deixá-lo acessivel pois não intendi isso. Se puder me responder e avisar pelo email. Abraço.

Germano disse...

Olá amigo, não consegui encontrar o seu e-mail para responder, por isso estou postando aqui mesmo.
Acontece que não é possível alterar e aplicar a variável java.library.path sem definir o Field do sys_paths como accessible. Por isso, foi feito desta forma para deixa-lo acessivel para alteração. Valeu

Anônimo disse...

No meu ta dando erro nessa classe Field? quais são os pacotes da onde vc ta importando essas classes, como a Field???