Integrando o tomcat e o eclipse como um ambiente hot-deploy

88

Gostaria de configurar o eclipse e o tomcat de maneira integrada, de forma que as alterações em meus JSPs e servlets (se possível) sejam refletidas imediatamente, sem exigir uma implantação.

Ok, essa é uma daquelas perguntas que tem muitas respostas em toda a internet, mas todas parecem diferentes. (use o plugin Sysdeo, use o plugin JBOss, faça coisas com um Eclipse desatualizado, use MyEclipse, etc.) e não consegui encontrar um recurso definitivo para me referir. Então, para meu benefício, qual é o procedimento mais simples e recomendado para fazer isso?

Isso pressupõe que eu tenho Eclipse e Tomcat funcionando de forma independente. Na verdade, consegui integrá-los de uma maneira não quente, usando as instruções aqui: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html

Versão do Eclipse Versão: 3.4.2 (Ganymede) Tomcat v6.0.20

udit
fonte
17
4 anos depois, estou perplexo com o fato de que ainda é um problema. Vamos, é muito fundamental.
Konrad Garus,
7 anos depois (quase), acho que descobri uma solução: stackoverflow.com/a/37064672/1034436
martian111

Respostas:

75

Existem duas opções.

Primeiro, o Eclipse permite que você faça isso, com uma ligeira mudança de configuração (veja também esta postagem detalhada )

  • adicione Tomcat à lista de servidores
  • tornar o projeto "Projeto web dinâmico" (por meio do assistente de criação ou da seção de facetas nas configurações)
  • adicione o projeto ao tomcat e configure seu "conjunto de implantação"
  • clique duas vezes no tomcat da lista para abrir as configurações
  • Altere "Publicação" para "Nunca publicar automaticamente" (isso significa que o servidor não será reiniciado quando você pressionar ctrl + s)
  • iniciar o tomcat em modo de depuração

Isso ainda refletirá as alterações de código, mas não reiniciará o servidor.

Em segundo lugar, usei o plug-in FileSync por muito tempo:

  • configurar o plugin para enviar todas as classes do diretor bin para WEB-INF/classes a instalação do seu tomcat (isso é quase o mesmo que configurar o assembly de implantação)
  • configurar todos os outros recursos para ir para seus respectivos locais
  • opcionalmente, externalize todos os caminhos absolutos das configurações de localização de sincronização de arquivos para uma única variável e configure essa variável no eclipse (assim, você também poderá confirmar as configurações de sincronização de arquivos, se todos os membros estiverem usando o eclipse)
  • adicione o Tomcat à lista de servidores no eclipse, configure a opção "Locais do servidor" como "Use a instalação do tomcat" (a tela abre quando você clica duas vezes no tomcat na lista de servidores)
  • iniciar o tomcat em modo de depuração

Funciona perfeitamente para mim dessa forma. Cada mudança não estrutural é refletida imediatamente, sem redistribuição.

Atualização:
você pode ler mais sobre os métodos de implantação a quente aqui .
eu também criei um projeto que sincroniza facilmente o espaço de trabalho com o contêiner de servlet.

Bozho
fonte
@VladimirTsvetkov não - essas são duas opções separadas
Bozho
Estou tentando sua primeira abordagem, mas estou usando Maven Overlays e quando altero um arquivo em uma das sobreposições, o servidor ainda é reiniciado (a sobreposição não é um projeto da web dinâmico, mas um módulo da web dinâmico). Alguma ideia?
Hoffmann,
2
Tenho a impressão de que, ao alterar "Publishing" para "Never publish automatically", os JSPs não são mais recarregados / recompilados quando alterados. A parte de recarregamento de classe funciona bem ao iniciar o Tomcat no modo de depuração.
yglodt
5
Eu faço isso de outra maneira: primeiro, mude para publicar automaticamente; segundo, clique Modulesna aba na configuração do servidor, depois clique edit, desmarque auto deploy enabled, acho que esta é a maneira mais simples. PS: sua primeira maneira não funciona para mim.
autoestrada
@hiway, onde está a guia Módulos dentro da guia de configuração do servidor?
Mateus Viccari,
30

Simplesmente deixe o eclipse gravar os arquivos de classe diretamente no diretório $ TOMCAT / webapps / MyWebApp / WEB_INF / classes. Em seguida, configure o apache-tomcat para verificar se os arquivos de classe foram atualizados e recarregue-os se tiverem sido.

Para configurar o tomcat para recarregar automaticamente uma classe quando ela muda, você precisa

editar $TOMCAT/conf/context.xmle definir:

<Context reloadable="true"> 

Você também pode ter que editar e recarregar seu webapps/$YourWebApp/web.xmlarquivo e incluir:

<web-app reloadable="true">

Não me lembro se as duas mudanças são necessárias, mas foi assim que configurei meu tomcat-6.0.18 para recarregar automaticamente.

Martin Tilsted
fonte
De acordo com a documentação, tomcat.apache.org/tomcat-6.0-doc/config/context.html eles recomendam não colocar Contextelementos no arquivo server.xml, mas deve monitorar / WEB-INF / classes / e / WEB-INF / lib para quaisquer alterações. Onde você leu sobre o atributo do web-appelemento?
Michael
Desculpe, interpretou mal sua resposta um pouco. O context.xml "deve ser carregado para cada aplicativo da web".
Michael de
2
Como você configura onde o Eclipse grava os arquivos de classe?
yglodt
7

Aviso : Sou apenas um cliente satisfeito, não trabalho para a Zero Turnaround e não sou afiliado de forma alguma a eles.

Confira o JRebel - ele permite que você codifique sem reiniciar o aplicativo da web. Basicamente, ele funciona instrumentando suas classes e adaptando suas mudanças. Ele lida com muitos mais casos do que a implementação a quente , incluindo:

  • Adicionando / removendo métodos
  • Adicionando / removendo construtores
  • Alterando interfaces
  • Adicionar / remover interfaces implementadas

É comercial ( detalhes de preços , US $ 550 / ano em junho de 2018) e tem muitos plug-ins para estruturas de terceiros, incluindo:

  • Guice
  • Primavera
  • Struts 2

Você obtém uma avaliação gratuita sem dor - sugiro que experimente .

Robert Munteanu
fonte
2
Jrebel, quando funciona, funciona. Quando isso não acontece, é um pesadelo. Eu tenho batido na minha cabeça com o apoio deles por mais de uma semana e ainda não consigo fazê-lo funcionar na minha configuração simples de mvc de primavera. Eles não ajudarão mais sem que eu envie meu aplicativo ou um helloworld do meu aplicativo. E, seus preços estão desatualizados - eles agora cobram uma bomba. Graças a Deus eu só usei a versão de teste deles
happybuddha
O preço atual é $ 365 / ano / assento
Joseph Lust,
E agora são $ 550 / ano / assento
frewper
3

Altere seu espaço de trabalho no Eclipse para \ tomcat \ webapps. Como é apenas para o seu trabalho, isso deve funcionar bem. Quaisquer mudanças feitas no Eclipse estão no mesmo diretório, o tomcat procura aplicativos para implantar

PaganSensei
fonte
3

Na visualização dos servidores, crie um novo servidor, não adicione nenhum recurso (projeto) ao servidor ainda. Clique duas vezes no servidor na localização dos servidores. Escolha "Usar instalação do tomcat". Modifique "Deploy path" para o diretório de implantação do tomcat (Ex: c: \ server \ Tomcat 7.0.14 \ webapps). Estenda a "Seção de publicação". Marque "Publicar automaticamente após um evento de construção". Salvar e fechar. No menu do eclipse, marque "Projeto -> Construir automaticamente". Na visualização dos servidores, clique com o botão direito do mouse em seu servidor, "Adicionar e remover" para publicar seu projeto.

ticu0000
fonte
2

Por que não usar um servidor Tomcat integrado com o Eclipse se for apenas para desenvolvimento? Você pode configurar servidores em janela-> preferências. Depois de configurado, se você tiver um jsp chamado page.jsp, você pode clicar com o botão direito nele e selecionar executar no servidor. Em preferências-> geral-> navegador da Web você pode escolher o clima para usar o navegador embutido ou um externo. Faça algumas alterações em seu jsp, salve e atualize sua página a partir do navegador. As alterações serão refletidas automaticamente assim que você salvar e atualizar seu navegador.

Jared
fonte
2

O que funciona para mim aqui é:

context.xml assim:

<Context path="/myapp" docBase="myapp" debug="5"
    reloadable="false" antiResourceLocking="false" antiJARLocking="true">
<!-- this because i´m using Spring 3.1 with Tomcat -->
    <Loader     loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />

</Context>

Então, na guia Servidores no Eclipse, na guia "Módulos", desativei o "Auto Reload" para todos os módulos sendo implantados.

Deixe também a configuração padrão para permitir a publicação automática.

E está usando Maven com WTP, não se esqueça de deixar o conteúdo de src / main / resources dentro, pois o Eclipse insiste em excluir o conteúdo desta pasta da compilação final.

Só com tudo isso eu consegui classes full (VM) hot-deploy com recursos hot-deploy !!!

chuckedw
fonte
1

Em seu ambiente de desenvolvimento, basta apontar seu servidor Tomcat para procurar JSPs em qualquer diretório em que você os está desenvolvendo. Assim que salvar o arquivo, você poderá ver as alterações.

Cameron
fonte
1

Consegui fazer isso funcionar em meu ambiente de desenvolvimento usando o agente JVM Spring Loaded . Embora eu desenvolva aplicativos da web Spring, a descrição do projeto menciona que é

utilizável em qualquer bytecode que pode ser executado em uma JVM

Usando a configuração a seguir, consegui obter alterações para publicar automaticamente em uma instância do Tomcat anexada (o método usual do Eclipse WTP). Estou usando o Spring Tool Suite 3.7.3 baseado no Eclipse Mars.2 (4.5.2).

  1. Baixe a versão mais recente do JAR do Spring Loaded de seu projeto Github . Isso foi testado com springloaded-1.2.5.RELEASE.jar.
  2. Configure um servidor Tomcat no Eclipse normalmente (testado com Tomcat 8.0.30)
  3. Abra a página de configuração do servidor Tomcat no Eclipse (clique duas vezes na instância do servidor na guia "Servidores").
  4. Na seção "Opções do servidor", desmarque "Módulos recarregados automaticamente por padrão".
    • Nota: Se você já tiver módulos da web adicionados ao servidor, pode ser necessário desabilitar o "Auto Reload" neles individualmente por meio da guia "Módulos" (na parte inferior da janela da página de configuração).
  5. Na seção "Informações gerais", clique em "Abrir configuração de inicialização"
    • Na guia "Argumentos", adicione o seguinte ao final dos "Argumentos da VM": -javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
    • Para permitir que os JARs sejam observados além dos .classarquivos do projeto , configure o -Dspringloaded=watchJars=argumento VM de acordo com os comentários deste problema .

Inicie o servidor e publique projetos de aplicativos dinâmicos da Web nele como de costume. Mais uma vez, fui capaz de testar isso com aplicativos da web Spring. Por exemplo, modificar o código, adicionar / subtrair métodos, etc. nas classes @Controller foram aplicados quase que instantaneamente depois que salvei o arquivo e o Eclipse construiu e publicou a classe alterada. Por último, a seção FAQ do projeto Spring Loaded mencionou alguns casos em que as coisas não recarregam, portanto, seria necessário reiniciar o servidor / aplicativo. Mas essas exceções são muito menos frequentes.

Mais uma observação: isso NÃO funciona com o Pivotal tc Server ou VMware vFabric tc Server que vem com o STS. Para esses servidores, há uma opção "Habilitar recarregamento baseado em Agente Java (experimental)", mas que usa a versão 1.2.0 anterior do Spring Loaded, que não funcionou para mim.

martian111
fonte
Parece que você deve aceitar Spring, Que tal a Non Springaplicação.
Tangoo
Embora você precise que o JAR SpringLoaded seja configurado para Tomcat, os aplicativos em execução NÃO precisam ser aplicativos Spring (nem incluir JARs Spring). Eu testei isso com sucesso com um Servlet HelloWorld simples e único.
martian111 de
0

Você está aberto para usar o Jetty para fins de desenvolvimento?

Em caso afirmativo, é muito simples de usar com Maven - basta executar mvn jetty:run

matt b
fonte
0

Essa pode não ser a melhor maneira, mas funciona para mim.

  • $ tomcat / conf / Catalina / localhost / .xml
  • $ contextPath / webapp / web / WEB-INF / lib / *. jar
  • $ contextPath / webapp / web /
  • $ eclispeWorkbench / project-servlet / src /
  • $ eclispeWorkbench / project-servlet / servlet.jardesc (deve exportar jar para lib dir em $ contextPath)
  • $ eclipseWorkbench / project-jsp /

Eu uso um comando rsync para sincronizar as alterações do meu projeto jsp para o $ contextPath.

Use a depuração remota no Eclipse para Tomcat, que permitirá a troca automática de código limitada. Se você alterar os campos estáticos ou adicionar métodos, precisará exportar o jar e reiniciar o contexto.

TJR
fonte
0

podemos usar a opção abaixo? Dê um duplo clique em Server in eclipse -> Server Locations -> Use tomcat installation. Ele assume o controle da instalação do tomcat. Você não precisa reiniciar o servidor para alterações nas classes java.

Tushar Sagar
fonte
0

Encontrei uma maneira mais simples: uso de links simbólicos: acho que é a maneira mais rápida porque não há sincronização: o diretório do tomcat e o diretório do seu projeto serão o mesmo diretório o tempo todo.

O Tomcat detectará periodicamente as mudanças e reimplantar seu aplicativo.

Também existe uma maneira de depurar seu aplicativo, então, humildemente, acho que é uma boa solução.

Documentei minha solução aqui , para qualquer pessoa interessada.

Raul Luna
fonte
posso saber por que é necessário usar o aplicativo Java remoto, uma vez que está usando localhost, o que significa que estou depurando usando minha própria máquina local
Karen Goh
0

Caso você esteja com pressa:

  1. marque "nunca publicar automaticamente" no tomcat (outro contêiner) no eclipse.
  2. inicie o tomcat (outro contêiner) no modo de depuração.

voila! :)

Sachin Verma
fonte
0

No Eclipse, clique em Projeto no menu superior e certifique-se de que “Construir Automaticamente” esteja selecionado. Isso resolveu meu problema. Eu estava executando o Eclipse com Tomcat usando meus metadados de espaço de trabalho. Eu também estava executando o Maven em um projeto de Módulo Web Dinâmico. Para verificar, adicione seu aplicativo ao Tomcat. Inicie o Tomcat de dentro do Eclipse. Certifique-se de que seu aplicativo esteja implantado e em execução. Abra a guia Console no Eclipse. Faça uma alteração em seu aplicativo. Após alguns segundos, você deve ver sua alteração sendo construída e implementada automaticamente no Tomcat.

NLessani
fonte
-2

Mais simples e rápido: configure o Eclipse para gerar um arquivo WAR ao construir; como uma etapa de pós-construção, copie o arquivo WAR para o diretório webapps do tomcat. O Tomcat reconhecerá a mudança e atualizará o site sem a necessidade de implantação. Observe que isso não é perfeito; os usuários que usam esse webapp podem ter uma experiência inferior à ideal, pois o Tomcat reinicia o webapp "sob" eles; mas isso atende ao seu pedido.

Paul Sonier
fonte
1
ok ... acho que não deixei minhas intenções claras. Eu realmente não estou interessado em implantar o aplicativo para alguns usuários, mas estou tentando executar um tomcat com Eclipse para minhas necessidades de desenvolvimento do dia a dia e encurtar o ciclo de feedback de (fazer mudança) -> (Ver Resultado) em vez de (Fazer Alterar) -> Implementar -> (Ver Resultado)
udit de