Fazer o deploy somente do que foi modificado

Oi …
Eu to tentando descobrir como eu posso fazer um deploy de arquivos um web application em java, mas eu so posso deployar os arquivos que eu alterei. Toda vez eu faço isso na mao, ou seja, altero os arquivos no meu computador, compilo e depois faço um deploy no ambiente de teste. Alguém sabe me explicar como eu posso automatizar isso? eu tentei fazer isso com o ANT, mas n achei a soluçao.
Quem puder me ajudar agradeço desde ja.

Ninguém?

Fala devaney,

Não vou entra aki em muitos detalhes. Mas sim lhe dar algum caminho para seguir.

Existe uma ferramenta muito poderosa para injeção de classes no classloader, ou seja modificar um arquivo .java e injetar o seu .class modificado diretamente no classloader, sem haver a nescedidade de reinicializar o servidor de aplicação para notar as modificações. Esta ferramenta se chama JRebel e você pode checar suas funcionalidades em http://www.zeroturnaround.com/jrebel/.

Depois de um tempo procurando, achei uma ferramenta open source que segue os mesmos moldes deste JRebel, a saber o classghost - http://classghost.sourceforge.net/. Este, por sua vez, é distribuído como uma interface gráfica swing, onde você escolhe o .class a ser injetado e realiza a operação. Como desejava fazer este processo de alteração instantaneamente durante o processo de desenvolvimento, adaptei o código fonte para que funcionasse como um plugin do eclipse. Deste modo, quando estou editando uma classe que está sendo executada em um servidor de aplicação, apenas aciono o plugin. Este fica responsável por pegar o .class do source modificado e substituir o .class atual do classloader.

Lembrando que não é qualquer modificação no código que funciona a injeção, como por exemplo mudança de hierarquia da classe.

Estou a disposição para mais esclarecimentos.

[]'s

Apesar de ter passado tanto tempo eu ainda preciso de uma ferramenta assim. Por incrivel que parecça nesse 1 ano que passou, eu anotava os nomes dos arquivos que eu ia modificando e no final eu fazia o deploy somente dos arquivos que eu alterei.
Vou tentar usar essa ferramenta q vc usou e depois te respondo.
Valeu

Agora que eu entendi o tipo de programa q vc me indicou, e nao era esse o meu promblema.
O meu problema é que quando eu altero algumas classes, eu tenho que colocar no ambiente de produçao somente as classes q eu alterei, nao posso colocar em produçao tudo oq eu tenho no meu pc local.
No ultimo ano, toda vez q eu alterava uma classe eu as colocava em uma directory a parte, no momento de coloca-las em prod eu pegava somente aquelas que eu alterei. Eu gostaria de automatizar isso sem q eu tenha q ficar preocupado se eu n to esquecendo nenhuma classe.
Entenderam?

Agradeço desde ja

Carinha, eu até estou entendendo o seu problema, mas, olha só:

  1. O arquivo war que você está usando é TÃAAAO grande assim que você precise fazer o deploy em pedacinhos? Por que?
  2. Alterar os arquivos .class em uma aplicação web “a quente” não é garantia nenhuma que esses .class sejam lidos, porque a classe pode já estar em memória, portanto quer você faça um deploy “parcial” ou “full” você tem que dar um restart na aplicação… Se esse é o caso, então porque fazer deploy parcial?
  3. Carinha, me parece que o seu problema é mais gerenciamento de versão… você usa algum tipo de repositório de versões, tal como o subversion? Verifique as opções de branch e merge nele…

[quote]

  1. O arquivo war que você está usando é TÃAAAO grande assim que você precise fazer o deploy em pedacinhos? Por que?[/quote]
    O problema é q n sou eu q desenvolvo (e modifico) a aplicaçao. Tem uma aplicaçao q ja ta online, frequentemente essa aplicaçao precisa ser modificada, os desenvolvedores alteram e mandam pra mim somente as classes que eles modificaram (dentro de um zip) e
    eu tenho q colocar essas classes nas directorys corretas, as vezes eu erro e coloco no lugar errado (alem do mais é mto chato fazer isso) e por isso eu quero automatizar esse processo.

Isso n é problema, eu paro a aplicaçao e faço o restart.

Acho q eles usam SVN, mas a SVN faz o controle dos codigos fontes e nao dos compilados.

Agradeço pela resposta

Não tens o codigo de toda a aplicação?
Para que possas gerar facilmente o war / ear com ant ou maven?

[quote=pmlm]Não tens o codigo de toda a aplicação?
Para que possas gerar facilmente o war / ear com ant ou maven?[/quote]
Todo o codigo n. Tenho todos os .class (ou seja toda a aplicaçao).

Eu estou começando a estudar como fazer isso, mas gostei MUITO de como funciona o Heroku (www.heroku.com). Quando você faz um git push do seu projeto, somente as alterações são enviadas e ele faz “commit” dessas alterações.
Feito isso, ele resolve as dependências, compila (se for preciso) e inicia a aplicação.

Eu ainda não descobri como montar uma estrutura dessa maneira, mas eu acho que com svn + maven + Hudson (Jenkins) seja possível.

A pergunta q n quer calar. Mas afinal, como vcs fazem o gerenciamento desses problemas?
Cenario:
Tem uma aplicaçao ja em produçao q geralmente recebe atualizaçoes, e claramente a cada atualizaçao os desenvolvedores passam para o grupo de implantaçao somente os arquivos compilados.
Como vcs fazem? Pegam cada arquivo e colocam nas directoryes corretas ou tem algum outro metodo automatizado q n conheço?

Em todos os projetos desenvolvidos em Java para a parte de implantação, eu nunca vi a necessidade de somente ficar trocando classes alteradas. Sempre era instalado bibliotecas (ear, war e jar) completas. A parte “incremental” era só referente a banco de dados e arquivos de configuração. Algumas vezes alguém pedia para trocar somente uma classe, mas era para “apagar incendio” (vulgo gambiarra), mas sempre se pedia para que fosse feito a instalação da versão “completa”.

Eu acho que você precisa ter um outro tipo de controle sobre sua aplicação. Por exemplo: como você controla a versão do seu sistema? Por classe? Para ter menos problemas, o ideal é que sua aplicação fosse modularizada para que o controle seja pelo mesmo por bibliotecas (.jar).

Essa escolha de “deployar” somente as classes alteradas, n foi minha, mas acho q tem uma razao. Visto que a aplicaçao passa por 3 ambientes (desenvolvimento, teste e produçao) o grupo de desenvolvimento nao pode me passar todo o jar, pois de qq jeito eu teria q mudar os arquivos de configuraçao do WAR q muda de ambiente pra ambiente (properties, web.xml etc).
O controle de versao é feito sim, o grupo de desenvolvimento me mandam os arquivos zip com um numero de versao na frente do nome do arquivo (tipo 1010_atualizacao_mensal.zip), assim se alguma coisa da errado é facil voltar uma versao ou qtas a gente quiser.
Deu pra entender c a minha explicaçao?

Carinha, eles estão entregando os arquivos em um zip, só com os arquivos, certo? Então qual o problema de simplesmente descompactar o zip na pasta raiz da instalação do ambiente? Ou eles entregam esse zip todo zoado, com os arquivos fora de posição?

Ou você tem que renomear as versões antigas para efetuar um rollback rápido?

Se sim, o que você precisa é um programinha, pode ser java, que pega os arquivos do zip, renomeia os arquivos destino e depois grava os arquivos do zip em seu lugar.

[quote=abmpicoli]Carinha, eles estão entregando os arquivos em um zip, só com os arquivos, certo? Então qual o problema de simplesmente descompactar o zip na pasta raiz da instalação do ambiente? Ou eles entregam esse zip todo zoado, com os arquivos fora de posição?

Ou você tem que renomear as versões antigas para efetuar um rollback rápido?
[/quote]
Eu n posso descompactar o zip na pasta pois a gente usa o BEA (weblogic) e para deployar uma aplicaçao o bea usa um file JAR.
Eles entregam o zip c na posiçao correta.

Eu to fazendo uma coisa parecida, um programa java q:

  • pega o arquivo zip e o jar deployado
  • faço uma copia de backup do arquivo jar deployado
  • abro o jar com um programa zip (7zip) e coloco dentro do jar os arquivos zip q os caras me passaram
  • Coloco o arquivo atualizado no servidor
  • reinicio a aplicaçao
  • Feito!

Mas esse programa comecei a fazer semana passada, e achei q existisse algo ja pronto.

[quote=oyama]Em todos os projetos desenvolvidos em Java para a parte de implantação, eu nunca vi a necessidade de somente ficar trocando classes alteradas. Sempre era instalado bibliotecas (ear, war e jar) completas. A parte “incremental” era só referente a banco de dados e arquivos de configuração. Algumas vezes alguém pedia para trocar somente uma classe, mas era para “apagar incendio” (vulgo gambiarra), mas sempre se pedia para que fosse feito a instalação da versão “completa”.

Eu acho que você precisa ter um outro tipo de controle sobre sua aplicação. Por exemplo: como você controla a versão do seu sistema? Por classe? Para ter menos problemas, o ideal é que sua aplicação fosse modularizada para que o controle seja pelo mesmo por bibliotecas (.jar). [/quote]
Pra dizer a verdade eu nao acho esse tipo de processo uma gambiarra, justamente por causa do outro fato que eu te disse. A gente trabalha c 3 ambientes e cada vez q os caras me enviassem uma patch de qualquer jeito eu teria q mudar alguns arquivos (properties, web.xml etc)