ClassLoader

Salve, Salve Galera!

Alguém pode ajudar?

Problema: Com uma aplicação rodando, e é necessário atualizar um arquivo .jar, a aplicação não é capaz de reconhecer se o jar foi alterado e continua usando as classes do jar que foram chamadas anterior mente pelo ClassLoader.

Pergunta: Como faço para detectar que o jar foi alterado e chamar pelo ClassLoader?!?!

Sei que o tomcat tem algo assim… alguém tem idéia de como isso acontece?? dicas?

Atn.
Dennys Fredericci
http://www.dennys.eti.br

o tomcat faz isso pela data dos arquivos se naum me engano… pois se vc colocar um arquivo com data anterior ao existente ele naum recarrega… ele deve verificar de acordo com a data de inicializacao do servidor…

aproveitando o topico, estou com problemas para carregar um jar… tipo quero fazer com q a aplicacao leia tds os jars em uma pasta e carregue as classes… qro fazer com q o programa acesse um db, entaum preciso q o programa carregue o driver jdbc para o banco(qualquer um) sem que precise estar definido no classpath…

[quote=“diegodrumond”]o tomcat faz isso pela data dos arquivos se naum me engano… pois se vc colocar um arquivo com data anterior ao existente ele naum recarrega… ele deve verificar de acordo com a data de inicializacao do servidor…

aproveitando o topico, estou com problemas para carregar um jar… tipo quero fazer com q a aplicacao leia tds os jars em uma pasta e carregue as classes… qro fazer com q o programa acesse um db, entaum preciso q o programa carregue o driver jdbc para o banco(qualquer um) sem que precise estar definido no classpath…[/quote]

Vc adicionou um contexto desta aplicação nõ server.xml?

<Context path="/scwcd"  docBase=""   debug="5"  reloadable="true"   crossContext="true">
      	      <Logger className="org.apache.catalina.logger.FileLogger"  prefix="scwcd" suffix=".log" timestamp="true"/>
      </Context>

Detalhe para o parametro reloadable

Atn.
Dennys Fredericci

Galera… o problema é o seguinte…

Eu quero atualizar o meu arquivo jar porém o sistema operacional trava o arquivo e não deixa eu mudar ele caso alguém esteja utilizando…

Como o tomcat faz para permitir que alguém possa alterar este arquivo?

Atn.
Dennys Fredericci

[quote=“Dennys”][quote=“diegodrumond”]o tomcat faz isso pela data dos arquivos se naum me engano… pois se vc colocar um arquivo com data anterior ao existente ele naum recarrega… ele deve verificar de acordo com a data de inicializacao do servidor…

aproveitando o topico, estou com problemas para carregar um jar… tipo quero fazer com q a aplicacao leia tds os jars em uma pasta e carregue as classes… qro fazer com q o programa acesse um db, entaum preciso q o programa carregue o driver jdbc para o banco(qualquer um) sem que precise estar definido no classpath…[/quote]

Vc adicionou um contexto desta aplicação nõ server.xml?

<Context path="/scwcd"  docBase=""   debug="5"  reloadable="true"   crossContext="true">
      	      <Logger className="org.apache.catalina.logger.FileLogger"  prefix="scwcd" suffix=".log" timestamp="true"/>
      </Context>

Detalhe para o parametro reloadable

Atn.
Dennys Fredericci[/quote]

Minha aplicacao eh em swing…

[quote=“diegodrumond”][quote=“Dennys”][quote=“diegodrumond”]o tomcat faz isso pela data dos arquivos se naum me engano… pois se vc colocar um arquivo com data anterior ao existente ele naum recarrega… ele deve verificar de acordo com a data de inicializacao do servidor…

aproveitando o topico, estou com problemas para carregar um jar… tipo quero fazer com q a aplicacao leia tds os jars em uma pasta e carregue as classes… qro fazer com q o programa acesse um db, entaum preciso q o programa carregue o driver jdbc para o banco(qualquer um) sem que precise estar definido no classpath…[/quote]

Vc adicionou um contexto desta aplicação nõ server.xml?

<Context path="/scwcd"  docBase=""   debug="5"  reloadable="true"   crossContext="true">
      	      <Logger className="org.apache.catalina.logger.FileLogger"  prefix="scwcd" suffix=".log" timestamp="true"/>
      </Context>

Detalhe para o parametro reloadable

Atn.
Dennys Fredericci[/quote]

Minha aplicacao eh em swing…[/quote]

Então o que vc quer é o que eu quero…

O que eu quero é carregar todos os jars de um diretório… sem usar o classpath…

o certo é usar o ClassLoader…

O ponto em que eu esbarrei foi o seguinte, carregar todas as classes de um jar é muito errado… o certo é usar o lazy-loading(carregar quando necessário)…

Mas não faço idéia de como implementar algo assim… estou fuçando as classes

ClassLoader…
URLClassLoader…

Atn.
Dennys Fredericci

tipo… pelo q entendi de um tutorial no guj sobre usar o classloader num jar, ele num carrega as classe td… soh q eu fiz igual no tuto lah e num funciono…

Opa!

Realmente ele não carrega todas as classes…

Eu criei uma classe que herda classloader e reescrevi alguns métodos, depois disso utilizo reflexão para chamar o método main da aplicação, assim para cada loadClass que a VM chamar desta aplicação será chamado o loadClass que eu reescrevi na classe, e lá eu coloquei de onde ele vai ler as classes, por exemplo em um repositório que eu determino…

Eu baixei o fonte do Tomcat e vi que é exatamente isso que ele faz! :slight_smile:

O ponto agora é saber como ele faz para recarregar uma classe que já foi chamada no loadClass… pelo que vi isso não é possivel pois a classe já está na memória e existe referências desta classe… o que ele faz(aparentemente) é utiliza JMX e trabalhar a aplicação como serviço, assim se ele sentir( pela data e hora do jar) que trocaram o jar ele dá um stop() no serviço e em sequida um start()…

Segunda-Feira vou implementar algo com o JMX para ver se é isto mesmo… :)… pelo menos já tenho a idéia rs*

Isso tá dando um trabalho :razz: … mas vai ficar show de bola!

Atn.
Dennys Fredericci
http://www.dennys.eti.br