Ajuda - Carregar Classes Remotas no Programa Cliente RMI

E ae galera.
Surgiu uma dúvida que eu nao consegui resolver ainda.

Estou usando RMI para uma arquitetura cliente/servidor. Até aí tudo bem. Apanhei um pouco mas consegui fazer tudo funcionar.

Meu ultimo problema foi que o cliente não encontrava as classes de modelo que eu criei (uso hibernate pra conectar ao database). Mas consegui resolver adicionando a linha:

java -Djava.rmi.server.codebase=file:///C:\Java\ServerRMI\bin\ ProgramaCliente

Aqui eu falo na hora de rodar programa onde é o codebase.
Ele consegue rodar agora direitinho o cliente e não dá o ClassNotFoundException.

Mas, como eu uso a classe modelo dentro do programa cliente?
Eu não posso simplesmente dar um import model.Produto, porque o cliente não encontra.

Tentando explicar melhor, eu tenho que retornar pro meu cliente a lista de produtos cadastrados, por exemplo. E retorno uma lista:

No servidor:

public List<Produto> getTodosProdutos()

E no cliente:

List produtos = stub.getTodosProdutos();

Esse List do cliente teria que ser um List, para eu poder usar o:

for(Produto produto: produto){
System.out.println(produto.getNome());
}

São dois projetos separados no eclipse. O ServerRMI e o ClientRMI.
Então eu nao posso simplesmente dar um import model.Produto no cliente, porque essa classe está no servidor.

Não consegui achar uma maneira de resolver isso.
Alguém tem uma idéia? Pode me ajudar?

Vlw.

Oi lucelioazevedo, bem vindo ao forum!

Minha sugestão para o seu problema é o seguinte:

Não sei a quanto tem vc lida com projetos java, caso vc esteja começando siga a idéia um pouco devagar para não se enrrolar.

Vamos lá… o que vc poderia fazer é dividir o projeto em 3 (calma, 2 partes vc já tem); uma parte será o server, outra parte o client e a outra um módulo comum entre os dois. Como vc já percebeu o seu client não encontra as classes necessárias, logo, teremos que disponibiliza-las.

Caso vc esteja utilizando o eclipse / netbeans, verá que tem como vc referenciar os projetos envolvidos, ou seja, no projeto client vc diz que depende do módulo comum, no server também vc diz que depende do módulo em comum.

O que haverá no projeto comum entre os dois lados (client, server) será justamente as classes que interessa aos dois lados.

Desta maneira vc conseguirá dar import nas classes tanto no client como no server.

Quando tudo estiver funcionando na IDE, você obviamente terá que gerar os arquivos JARs correspondente e coloca-los nos lugares adequados, ou seja, ao instalar o client vc terá que colocar os JARs correspondente ao projeto comum junto e ao instalar o server fazer também a mesma coisa.

Devo alertar-lhe que se vc tiver uma classe que produza objetos persistidos que possuir agregações (ex. Pedido com uma lista de itens) vc deverá colocar o(s) JARs do hibernate também no client porque ele injeta um tipo de lista customizada onde houver List<>.

ATENÇÃO

Este tipo de estratégia tem, ao meu ver, 2 pontos bem negativos a saber:

  1. Motiva vc a expor seu modelo (O(s) JARs do projeto em comum com classes do tipo Pessoa, Pedido e etc…).
  2. Inclusão de JARs do Hibernate no cliente.

Você pode evitar isto utilizando DTOs por exemplo.

Apesar da idéia ter pontos negativos, acredito que ela irá lhe ajudar a dar um passo a mais em direção a seus objetivos.

flws

é cara.
Entendi isso e já tinha pensado nisso.
Em deixar um projeto comum aos dois. E também já tinha percebido que deixaria coisas expostas e não gostei disso.

Esse lance de DTO eu nunca vi. Vou tentar entender.
Meu problema é que isso veio pra mim segunda e tenho que apresentar a solução sexta-feira.
Tempo não está a meu favor.

Talvez eu faça do jeito feio e depois vá corrigindo, pois terei mais tempo depois.
A pessoa qeu necessita do quer ver algo funcionando.
Aquela história, terra de cego quem tem um olho é rei. Ele nao quer saber como está funcionando. Ele quer funcionando. Porque ele nao tem nada.
Essa preocupação eu sempre tenho, de fazer da melhor maneira. Mas valeu.

Em tempo: você tem alguma coisa sobre DTO que te ajudou? (já estou googlando aqui. ehheheheheheh)

Abraços!