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.