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

Entenda como o mecanismo de classloading funciona no Java e estude a classe UrlClassLoader.

Hum… estou chegando lá :slight_smile:

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

Eu quero atualizar o arquivo jar sem ter que parar o sistema…

No tomcat ele permite você sobrescrever o arquivo…

Alguém sabe como o tomcat faz para permitir que alguém possa sobrescrever este arquivo?

Atn.
Dennys Fredericci

Use um SO que preste… :wink:
Extraia o jar no diretorio de trabalho ou expanda ele em memoria.

[quote=louds]Use um SO que preste… :wink:
Extraia o jar no diretorio de trabalho ou expanda ele em memoria.[/quote]

Todo SO vai segurar o jar…

pois o jar está sendo utilizado pelo processo X… blá blá blá…

No tomcat ele permite você trocar o jar e ele ainda verifica se o jar é mais recente, se for ele chama lá um ClassLoader e se vira…

O problema é trocar este jar…

Atn.
Dennys Fredericci

Recomendo o livro Java Reflection in Action.

[quote=Dennys]
Todo SO vai segurar o jar…[/quote]

Todos quais cara-pálida?

[quote=louds][quote=Dennys]
Todo SO vai segurar o jar…[/quote]

Todos quais cara-pálida?[/quote]

ele vai segurar o jar se ele estiver no classpath! o que eu quero é um “classpath” dinamico… eu achei a solução… vou implementar e posto aqui…

Atn.
Dennys Fredericci

Fala Lipe! Entendi(acho) rs* o porque da recomendação do livro…

O ponto que eu cheguei até agora foi o seguinte:

Achei uma classe do Tomcat que implementa ClassLoader, aparentemente é o que eu preciso :)…

E por reflexão eu chamo o main da classe que eu quero deixar com um classloader dinamico…

A reflexção ficou assim:

Class loadedClass = cl.loadClass("br.com.ymf.business.Business");
Object object  = loadedClass.newInstance();
Method method = loadedClass.getMethod("main", new Class[] { String[].class });
method.invoke(object, new Object[] { new String[] {"vai carai!!!"} });

Se rodo ele no eclipse com o classpath configurado ele funciona beleza…obvio…

Agora se eu rodo ele no prompt de comando ele dá uma exeption…

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at BootStrap.load(BootStrap.java:103)
        at BootStrap$1.actionPerformed(BootStrap.java:56)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: br/com/ymf/Classe
        at br.com.ymf.business.Business.main(Business.java:24)
        ... 29 more

Alguém tem alguma idéia?

Atn.
Dennys Fredericci

Aeeeee!

Consegui fazer com que a aplicação tenha seu próprio classloader! :slight_smile:

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

Dennys, como foi a solução que você adotou para o problema?

Estou fazendo um código aqui onde uso o ClassLoader, até então é bem simples e usei certas linhas que você citou neste tópico. Eu compilo sem problemas, até executo pelo JCreator, porém quando vou usar o método em um arquivo jsp, nas linhas de código com o ClassLoader, ele perde o rumo da miada me retornando um java.lang.ClassNotFoundException.

Assim, queria saber a solução que você utilizou, pois quem sabe poderá ser a minha também! :frowning:

Desde já agradeço a compreensão.

C’ya

O classpath do teu classloader está errado.

[quote=O_SANTO_]Dennys, como foi a solução que você adotou para o problema?

Estou fazendo um código aqui onde uso o ClassLoader, até então é bem simples e usei certas linhas que você citou neste tópico. Eu compilo sem problemas, até executo pelo JCreator, porém quando vou usar o método em um arquivo jsp, nas linhas de código com o ClassLoader, ele perde o rumo da miada me retornando um java.lang.ClassNotFoundException.

Assim, queria saber a solução que você utilizou, pois quem sabe poderá ser a minha também! :frowning:

Desde já agradeço a compreensão.

C’ya[/quote]

Em que ambiente você vai usar o classloader?!

Não entendi o que você quer com ClassLoarder e JSP…

Atn.
Dennys Fredericci