Como atualizo um webapp do Tomcat sem reiniciar todo o serviço?

93

Eu sou novo em Tomcat. Temos uma máquina de desenvolvimento com cerca de 5 aplicativos em execução. Mesmo sendo dev, é usado por nossos clientes bastante durante os testes.

Então, digamos que precisamos fazer uma pequena mudança em um arquivo de classe. Agora, temos que desligar o Tomcat (afetando os outros quatro aplicativos), excluir o WARarquivo (e o diretório do aplicativo da web), reimplantar o novo WARarquivo e reiniciar Tomcat.

Claro, isso perturba algumas pessoas porque destrói todas as sessões conectadas para todos os aplicativos.

Existe uma maneira melhor de fazer isso? Quer dizer, há uma maneira de recarregar apenas a CLASSE que mudou em vez de tudo na máquina de desenvolvimento?

Obrigado.

cbmeeks
fonte
Alterar seu gerenciamento de sessão para algo que persiste para arquivar? Desculpe, não pude resistir :)
rogerdpack
1
@rogerdpack Aprendi muito sobre o Tomcat desde que fiz essa pergunta, há seis anos. Mas obrigado mesmo assim.
cbmeeks
Sobre hot swapping apenas de classes, consulte stackoverflow.com/questions/32459047/…
rogerdpack

Respostas:

59

Você já tentou usar o aplicativo Gerenciador do Tomcat ? Ele permite que você desimplante / implante arquivos war sem desligar o Tomcat.

Se você não quiser usar o aplicativo Manager, também pode excluir o arquivo war do diretório webapps, o Tomcat irá remover a implantação do aplicativo após um curto período de tempo. Você pode então copiar um arquivo war de volta para o diretório, e o Tomcat implantará o arquivo war.

Se você estiver executando o Tomcat no Windows, pode ser necessário configurar seu Contexto para não bloquear vários arquivos.

Se você absolutamente não pode ter nenhum tempo de inatividade, você pode querer olhar as implantações paralelas do Tomcat 7. Você pode implantar várias versões de um aplicativo da web com o mesmo caminho de contexto ao mesmo tempo. As regras usadas para corresponder solicitações a uma versão de contexto são as seguintes:

  • Se nenhuma informação de sessão estiver presente na solicitação, use a versão mais recente.
  • Se as informações da sessão estiverem presentes na solicitação, verifique o gerenciador de sessão de cada versão para uma sessão correspondente e se uma for encontrada, use essa versão.
  • Se as informações da sessão estiverem presentes na solicitação, mas nenhuma sessão correspondente puder ser encontrada, use a versão mais recente.
Steve K
fonte
Essa também é uma boa sugestão. Nunca tinha ouvido falar do app manager até hoje. Sim, usamos Windows. Uma preocupação que tenho ao excluir o arquivo WAR e esperar é que nossos clientes estão esperando "pequenas correções" com frequência. Essas sugestões funcionariam para esse cenário?
cbmeeks
1
@cbmeeks - Depende da frequência com que essas pequenas correções acontecem e quanto tempo leva para alguém perceber. Em qualquer um dos casos, o aplicativo ficará indisponível por um curto período de tempo. Depende do seu hardware / aplicativo quanto tempo é esse tempo. Mas é medido em segundos, eu diria geralmente 5-10 em nossos aplicativos. Mas sua milhagem pode variar :)
Steve K
1
Uau. Aprendi muito desde que fiz esta pergunta. Sim, agora implantamos aplicativos Tomcat sem derrubá-lo completamente. Uma coisa que fiz foi garantir que todos os logs (app e Tomcat) não gravassem DENTRO da pasta de aplicativos / aplicativos da web. Ou configurar o Tomcat para não bloquear também funciona. Portanto, colocamos o registro em um local central fora da pasta do Tomcat. Funciona como um sonho. Mas sua resposta foi muito útil. Obrigado!
cbmeeks
5
Ao reimplantar sem reiniciar, você terá que ter cuidado com vazamentos de memória - muitas vezes os carregadores de classe vazam referências e você precisa reiniciar todo o processo do Tomcat para liberar memória da versão antiga do aplicativo. LiveRebel (mencionado em outra resposta) pode automatizar tudo isso para você.
Neeme Praks de
3
Você não precisa deletar a guerra para reimplantar. Copie a velha guerra e espere alguns segundos.
peceps
30

Existem várias maneiras fáceis.

  1. Basta tocar em web.xml de qualquer aplicativo da web.

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

Você também pode atualizar um arquivo jar específico em WEB-INF / lib e, em seguida, tocar em web.xml, em vez de construir o arquivo war inteiro e implantá-lo novamente.

  1. Exclua o diretório webapps / YOUR_WEB_APP, o Tomcat começará a implantar o war em 5 segundos (assumindo que seu arquivo war ainda exista na pasta webapps).

  2. Geralmente, a substituição do arquivo war com a nova versão é reimplantada pelo tomcat automaticamente. Caso contrário, você pode tocar em web.xml conforme explicado acima.

  3. Copie sobre um "diretório" já explodido para sua pasta de webapps

Chirag Katudia
fonte
1
Útil saber que o método 'touch' não recarrega classes. IOW, ele não limpa e recarrega a hierarquia do carregador de classe para o webapp
Rondo
2
Ver por que isso funciona pode ser lido $CATALINA_BASE/conf/context.xml. O WEB-INF / web.xml é monitorado para alterações. Outros recursos podem ser facilmente listados lá, conforme necessário.
Kevin
21

No diretório conf do apache tomcat você pode encontrar o arquivo context.xml. Nessa tag de edição como < Context reloadable = "true" >. isso deve resolver o problema e você não precisa reiniciar o servidor

skal
fonte
Prefira o aplicativo gerenciador. Esta é uma operação cara para o aríete.
Classificador de