[Resolvido] Pegar dados de uma classe em um JAR

7 respostas
gregorioarthur

Buenas galera!

estou com o seguinte dilema, preciso criar um atualizador para duas aplicações que fiz aqui no meu trabalho, as duas app’s tem uma classe chamada Programa onde guardo suas versões e seus nomes… a princípio, queria que meu atualizador ao ser chamado pegasse o JAR da app e fosse até a classe programa e buscasse o atributo da versao… OK até a parte de como ele vai pegar os dados eu sei, o detalhe é como vou carregar o JAR em Runtime…

Gostaria de saber se alguem ja fez isso ou se sabe como fazer, pois preciso dos dados desta classe para comparar com os dados da mesma classe porem na versao no va da app… por exemlo:

Versao atual = 1.0
Nova Versao = 1.1

ai ele atualiza… sacaram?

grato por quem puder ajudar.

Arthur

7 Respostas

gregorioarthur

ninguem?!

M

Se você tiver o JAR do cliente no seu classpath, basta carregar a classe com Class.forName() e usar reflection para ver o conteúdo do campo. Isso é aplicável no seu caso?

UMC

se tiver no NetBenas va no projeto q vc quer chamar o jar ve Biblioteca btn dto do mouse ! Add JAR
quando for chamar uma classe vc usa os IMPORTS !!
vlw
abs

gregorioarthur

UMC:
se tiver no NetBenas va no projeto q vc quer chamar o jar ve Biblioteca btn dto do mouse ! Add JAR
quando for chamar uma classe vc usa os IMPORTS !!
vlw
abs

nao nao, isso eu sei como faz, mas ele não será um Lib do projeto. vlew.

no caso assim, eu tenho jar mas ele nao vai estar no classpath, pensa assim:

nesse esquema ai de cima, os dois estarão na mesma pasta nao no classpth um do outro ou so do atualizador (que é o q precisa pegar informacoes do JAR da aplicação.)

oq preciso mesmo saber, eh como carregar o JAR na aplicação sem tê-lo no lib da outra aplicação, tipo o getResource()

Extreme Paint Insane! eahaeuaehuaehueau
vlew!

gregorioarthur

Opá!

entao, descobri esse pacote “java.util.jar” que tem um classe chamada JarInputStream…

será que com ela tem como fazer oq quero?

alguem já usou, sabe usar?

vlew!

M

O problema do InputStream é que nesse caso seu arquivo vai estar compilado (em bytecode). Uma leitura desse arquivo não adiantaria muito, entende?

gregorioarthur
cheguei nisso:
package teste;

import java.net.*;

import java.lang.reflect.Field;

/**
 *  
 * @author Arthur Gregorio
 * @version 1.0.0
 * @since Release 1.0.0
 */
public class Main {

    /**
     * @param args Empacotamento Geral das classes
     */
    public static void main(String[] args) {
        new Main().getInfo();        
    }

    private void getInfo () {

        Class clazz = null;
        ClassLoader loader = null;

        try {
            loader = new URLClassLoader(new URL[]{
                new URL("file:C:\\temp\\test\\sf.jar")}, null);

            // adicionei o caminho da classe aqui e funfou!
            clazz = loader.loadClass("br.sfext.classes.Programa");

            Object obj = clazz.newInstance();

            Field field = clazz.getField("PRODUTO");
            field.setAccessible(true);

            String campo = (String) field.get(obj);
            System.out.println(campo);

        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (SecurityException ex) {
            ex.printStackTrace();
        } catch (NoSuchFieldException ex) {
            ex.printStackTrace();
        }
    }
}

ele acha o Jar, mas nao axa a classe dentro do JAR.

olha o erro:

run:
java.lang.ClassNotFoundException: Programa
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
        at teste.Main.getInfo(Main.java:31)
        at teste.Main.main(Main.java:19)

Alguem pode ajudar?

O problema do InputStream é que nesse caso seu arquivo vai estar compilado (em bytecode). Uma leitura desse arquivo não adiantaria muito, entende?

vlew cara, ja desisti desta idéia.

Arrumei!!!

Era so por o caminho inteiro do pacote até a classe, eahueahueauheaueauh, jeguice momentanea!
deu certo agora galera, vlew por que ajudou!

Criado 12 de janeiro de 2010
Ultima resposta 14 de jan. de 2010
Respostas 7
Participantes 3