Carregando .JARs de um diretório em tempo de execução.  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
root_
JavaGuru
[Avatar]

Membro desde: 05/09/2006 15:46:19
Mensagens: 206
Localização: Gurupi - Tocantins
Offline

Bom... estou usando o HSQLDB para fazer uma aplicação com DB Standalone mesmo, e tenho .jars q eu gostaria de aproveitar na aplicação, como por exemplo o proprio hsqldb.jar. Entao ao inves de eu ficar colocando toda vez o hsqldh.jar no classpath do PC onde instalo a aplicação, apenas criei um diretório chamado LIBS e carrego todos .jars q eu quero via uma classe que preparei para esse tipo de necessidade.

import java.io.IOException;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class LoadingJars
{
private static final Class[] parameters = new Class[] { URL.class };

public static void addToClasspath(URL u) throws IOException
{
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();

Class sysclass = URLClassLoader.class;
try
{
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
System.out.println(u.toString());
}
catch (Throwable t)
{
t.printStackTrace();
throw new IOException("ERror, could not add URL to system classloader");
}

}

public static void scanJars(String moduleFolder)
{

File moduleDirectory = new File(moduleFolder);
String classpath = System.getProperty("java.class.path");
File[] moduleFiles = moduleDirectory.listFiles();
for (int i = 0; i < moduleFiles.length; i++)
{
File moduleFile = moduleFiles[i];
if ( moduleFile.getName().endsWith(".jar") || moduleFile.getName().endsWith(".dll") )
{

if(classpath.indexOf(moduleFiles[i].getName()) == -1)
{
try
{
addToClasspath(new URL("file:/"+moduleFile.getAbsolutePath()) );
}
catch(IOException e){}

}
else
{
continue;
}
}
}
}


Utilização da classe:
Crie uma instancia dela na sua aplicação onde necessite os .jars no classpath e chame o metodo scanJars(Diretorio_onde_estao_os_jars)
Exemplo:
import java.util.*;
import java.net.*;
import java.sql.*;
import java.io.File;
import java.io.*;
import java.lang.reflect.Method;



public class ConnectTeste1
{
public Connection conn;

public void conecta( String dbfile ) throws Exception
{

Class.forName("org.hsqldb.jdbcDriver");
conn = DriverManager.getConnection("jdbc:hsqldb:"+ dbfile,"sa","");
System.out.println("Connect OK!");

}
public void shutdown() throws SQLException
{
Statement st = conn.createStatement();
// db writes out to files and performs clean shuts down
// otherwise there will be an unclean shutdown
// when program ends
st.execute("SHUTDOWN");
conn.close(); // if there are no other open connection
System.out.println("Cosed Connect OK!");
}

public static void main(String args[])
{

//==========Carregando bibliotecas necessárias//
LoadingJars lj = new LoadingJars();
String moduleFolder = System.getProperty("user.dir")+ "/libs";
lj.scanJars(moduleFolder);
//System.out.println(System.getProperty("java.class.path"));

String dbfile = System.getProperty("user.dir") + "/db/teste";
ConnectTeste1 teste = new ConnectTeste1();
try
{
teste.conecta( dbfile );

}
catch (Exception ex1)
{
System.out.println("EX1 acionado!");
ex1.printStackTrace(); // could not start db
return; // bye bye
}
try
{
teste.shutdown();

}
catch( SQLException ex3 )
{
ex3.printStackTrace();
}


}// fim main

}// fim class



ESPERO TER AJUDADO! Pelo menos pra mim funcionou tranquilo.

Rogério Milhomens de Queiroz
Agile - Consultoria em Tecnologia da Informação!
http://www.agilecti.com.br
Dataview - Inteligência em Tecnologia!
http://www.dataview.com.br
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team