Carregar class necessária para conexão JDBC em tempo de execução

7 respostas
L

Boa tarde amigos, estou com um problema e acredito que alguém possa me ajudar. Estou desenvolvendo uma aplicação que irá conectar com qqr banco de dados (sem uso de hibernate). Esta aplicação deverá conectar ao banco para ler sua estrutura (DDL).

Então eu pensei em implementar uma rotina (como o do netbeans para conexão de banco) que permita adicionar as jar responsáveis pela conexão com um determinado banco de dados. Depois de adicionar esta conexão, eu deveria conseguir conectar no banco.

Preciso fazer com que isto funciona da mesma forma que funciona no netbeans (Serviços -> Banco de dados -> Nova Conexão).

Eu pensei em colocar um cadastro aonde eu informe o nome do driver (com.ibm.db2.jcc.DB2Driver, por exemplo) e todas as classes que este cara irá usar. Aliás, isto eu já implementei… agora queria poder carregar para que não dê a mensagem de ClassNoFound.

Muito obrigado… Antecipo agradecimentos.

7 Respostas

A

cara,

posta seu codigo para possamos te ajudar.

t+

rmendes08
String nomeClasseDriver = "org.jdbc.MyDatabaseDriver";

Class.forName(nomeClasseDriver);
E

o usuario faria o upload das dependências do banco também seria isso?

rmendes08

Sim, aí você tem que cuidar de gravar o arquivo no classpath da aplicação. De qualquer maneira o usuário tem que formar o nome da classe do driver.

E

Você precisa ter conhecimento de como classloaders funcionam. O problema é que isso envolve criar um “custom classloader”, carregar a classe através desse classloader, e - o que é mais complexo - fazer com que sua aplicação também reconheça as classes que esse classloader carregou.

L
Sim, faria isto tbm Seria da mesma forma que o netbenas faz Eu  um exemplo na net (<a href="http://www.kfu.com/~nsayer/Java/dyn-jdbc.html">http://www.kfu.com/~nsayer/Java/dyn-jdbc.html</a>) e tentei implementar Tentei com o DB2 ele acho que até conseguiu carregar algo, pois ele chamou a license (dependencia do DB2). Daí deu o seguinte erro:

com.ibm.db2.jcc.c.SqlException: [ibm][db2][jcc][10333][11649] No license was found. An appropriate license file db2jcc_license_*.jar must be provided in the CLASSPATH setting.

at com.ibm.db2.jcc.c.o.d(o.java:534)

at com.ibm.db2.jcc.c.p.a(p.java:332)

at com.ibm.db2.jcc.c.p.(p.java:404)

at com.ibm.db2.jcc.b.b.(b.java:256)

at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:163)

at utils.DriverShim.connect(DriverShim.java:30)

at java.sql.DriverManager.getConnection(DriverManager.java:582)

at java.sql.DriverManager.getConnection(DriverManager.java:185)

at utils.Teste.main(Teste.java:27)

Só que como fazer para carregar estas dependências eu não sei como devo proceder.

Será que alguém pode me ajudar?

L

Bom dia, pessoal, fiz o seguinte teste:
1 - Fiz o deploy da minha aplicação no netbeans e ele gerou o diretorio: C:\Projeto\dist\ e dentro de diretório ele criou o MeuProjeto.jar e um outro diretório chamado lib (com todas as jars que meu aplicativo utiliza).
2 - Minha aplicação só tem os drives JDBC do MySQL e em meu teste, tentei conectar ao DB2
3 - Copiei para o diretório lib (C:\Projeto\dist\lib) as duas jar’s que o DB2 utiliza para conectar: o db2jcc.jar e o db2jcc_license_cu.jar.
4 - Rodei o meu aplicativo direto do diretótio dist.
5 - Deu erro de Class Not Found.

Segundo teste:
1 - Removi os dois arquivos jar do DB2 do diretório lib
2 - Pelo Netbeans, adicionei a biblioteca do DB2 ao meu projeto e fiz o deploy (ele gerou também os dois arquivos no diretório lib)
3 - Rodei o meu aplicativo direto do diretótio dist.
4 - Deu Certo!

Só que isto não resolve o meu problema… eu preciso permitir que bibliotecas adicionais sejam inseridas depois que o aplicativo esteja pronto, da mesma forma que foi utilizado no primeiro teste.

Quando eu tento conectar a um novo driver, eu tenho o nome deste driver (com.ibm.db2.jcc.DB2Driver no caso do DB2) então meu sistema deve apenas carregar as jar’s referente ao driver que o usuário cadastrou.

O método da classe que faz o teste de conexão está assim:

ConnectionTester

public Boolean tryConn() {
        try {            
            Class.forName(this.driver);
            this.conn = DriverManager.getConnection(this.url, this.user, this.pass);
            return true;
        } catch (Exception e) {
            Util.setError("ERROR (ConnectionTester.tryConn):"+ e.getMessage());
            return false;
        }
    }

Como resolver isto?

[]as

Criado 27 de outubro de 2011
Ultima resposta 28 de out. de 2011
Respostas 7
Participantes 5