Adicionar arquivos .class em um JAR em tempo de execução

7 respostas
T

Gostaria de adicionar os .class de determinados objetos em um JAR. Existe um meio de fazer isso em tempo de execução, ou seja, atraves de código?

Agradeço a ajuda

7 Respostas

C

Thiago,

pra quê você quer fazer isso?! 8O

E se esse seu JAR tiver em um deploy?! Como você irá restartar o container web ou o servidor de aplicação?!

T

Ola Rafael.

Estou tentando fazer isso como uma forma de migrar codigo para ser executado em maquinas remotas. trabalho com computacao distribuida, neste contexto, o nó “cliente” possui classes concretas (que executam de fato alguma computacao) que estendem uma classe abstrata que tanto o cliente quanto o servidor conhecem. no atual cenario de minha aplicacao, quando um nó “servidor” recebe os objetos das classes concretas para serem executados, uma ClassNotFoundException é lancada. a grande questao do meu trabalho é a MIGRAÇÃO DE CODIGO. estou querendo evitar ao maximo XML.

Agradeco a ajuda

L

Tah se eu entendi o cliente (vamos supor minha máquina) tem classes que fazem algo, o servidor só conhece por exemplo Object (que tah fazendo o papel da minha classe abstrata) ai vc tem lá um servidor que vai ficar recebendo a minha classe e quer que ele execute ela?! e ai eu como cliente crio uma classe que extends a abstrata e modifico o método toString por exemplo para instanciar outros objetos que o servidor tb não tem, mando pro servidor, ele executa toString e pau?!

foi isso que entendi e se sim, como vc envia isso pro servidor?!

eu acho que isso vai acabar entrando em uma discução de segurança

F

Olá!

Nem vou entrar na questão de segurança como o luBS falou.

Mas, talvez essa classe que colei aqui pode te ajudar. Ela coloca algum jar no classpath em runtime.
Ou seja, tu poderia receber um monte de bytes do servidor, criar no disco um jar com esses bytes,
e chamar os método dessa classe para colocar essas classe no ClassLoader.

Mas já te digo que tu pode ter problemas se tu usar um ambiente que use um classloader diferente de

java.net.URLClassLoader

Nunca cheguei a testar muito a fundo essa classe, então não sei se tem outros problemas! :wink:

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class JarUtils {

    private static final Class[] parameters = new Class[] { URL.class };

    /**
     * Add a lib to classpath
     * 
     * @param s
     * @throws IOException
     */
    public static void addToClasspath(String s) throws IOException {
        File f = new File(s);
        addToClasspath(f);
    }

    /**
     * Add a lib to classpath
     * 
     * @param f
     * @throws IOException
     */
    public static void addToClasspath(File f) throws IOException {
        addToClasspath(f.toURL());
    }

    /**
     * Add a lib to classpath
     * 
     * @param u
     * @throws IOException
     */
    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 });
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IOException(
                    "Error, could not add URL to system classloader");
        }

    }
T

.

T

Olá LuBS. o que ta acontecendo é mais ou menos o que vc disse. do lado “cliente” possuo as classes CONCRETAS (responsáveis pela computacao) que estendem a classe abstrata que TODOS os nós conhecem. quando envio um objeto de uma determinada classe concreta para um nó “servidor” qualquer, este precisa deserializar o objeto, e isto gera uma ClassNotFoundException. Estou desenvolvendo uma aplicação P2P, sendo assim estou utilizando JXTA. Esta “biblioteca” me fornece um container para enviar dados atraves da rede, o objeto Message, que me permite enviar 3 tipos de dados: 1) array de bytes (por isso tenho que serializar), 2) string e 3) XML.

se eu conseguir passar pela deserializacao, tudo funcionaria, ja que, quando copio as classes concretas para os nós servidores, nao acontece nenhum problema.

OUTRO PROBLEMA: como a cominucacao utilizando JXTA é muito cara, preciso mandar todos os dados e objetos necessarios de uma só vez, nao podendo, por exemplo, utilizar um protocolo do tipo REQUEST-RESPONSE.

Agradeco a ajuda

Y

Ble fabiofalciPJ,

Depois de tanto tempo tenho um problema igual ao do nosso amigo preciso add uma classe ao jar.

Tentei usar reflection para carregar a classe, funciona em partes. Utilizo estas classes para criar uma entidade com o jpa. Ele adiciona as anotações mas na hora de criar o EntityManager ele não encontra a classe,
então pensei em colocar elas fisicamente no classpath, e vi o seu exemplo mas num consegui fazer.

Vc pode me dar uma mão?

Vlw

Criado 30 de maio de 2007
Ultima resposta 22 de mai. de 2012
Respostas 7
Participantes 5