Intégration de Tomcat et Eclipse dans un environnement de déploiement à chaud

88

Je voudrais configurer eclipse et tomcat de manière intégrée de manière à ce que les modifications apportées à mes JSP et servlets (si possible) soient immédiatement reflétées sans nécessiter de déploiement.

Ok, c'est l'une de ces questions qui a beaucoup de réponses sur Internet, mais elles semblent toutes différentes. (utilisez le plugin Sysdeo, utilisez le plugin JBOss, faites des trucs avec un Eclipse obsolète, utilisez MyEclipse à la place, etc.) et je n'ai pas trouvé de ressource définitive à laquelle faire référence. Donc, à mon avis, quelle est la procédure la plus simple et la plus recommandée pour configurer cela?

Cela suppose que j'éclipse et Tomcat fonctionnent indépendamment. En fait, j'ai réussi à les intégrer de manière non à chaud en utilisant les instructions ici: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html

Version Eclipse Version: 3.4.2 (Ganymède) Tomcat v6.0.20

modifier
la source
17
4 ans plus tard, je suis déconcerté par le fait que c'est toujours un problème. Allez, c'est assez fondamental.
Konrad Garus
7 ans plus tard (presque), je pense avoir découvert une solution: stackoverflow.com/a/37064672/1034436
martian111

Réponses:

75

Il existe deux options.

Tout d'abord, Eclipse vous permet de le faire, avec un léger changement de configuration (voir aussi cet article détaillé )

  • ajouter Tomcat à la liste des serveurs
  • faire le projet "Projet web dynamique" (Soit via l'assistant de création, soit via la section facettes dans les paramètres)
  • ajoutez le projet à tomcat et configurez son «assembly de déploiement»
  • double-cliquez sur tomcat dans la liste pour ouvrir les configurations
  • Remplacez "Publication" par "Ne jamais publier automatiquement" (cela signifie que le serveur ne sera pas redémarré lorsque vous appuyez sur ctrl + s)
  • démarrer tomcat en mode débogage

Cela reflétera toujours les changements de code mais ne redémarrera pas le serveur.

Deuxièmement, j'utilise le plugin FileSync depuis longtemps:

  • configurer le plugin pour envoyer toutes les classes du directeur bin à WEB-INF/classesvotre installation tomcat (c'est presque la même chose que la configuration de l'assembly de déploiement)
  • configurer toutes les autres ressources pour accéder à leurs emplacements respectifs
  • éventuellement, externaliser tous les chemins absolus des paramètres d'emplacement de synchronisation de fichiers vers une seule variable et configurer cette variable dans eclipse (ainsi vous pourrez également valider les paramètres de synchronisation de fichiers, si tous les membres utilisent eclipse)
  • ajoutez Tomcat à la liste des serveurs dans eclipse, configurez l'option "Emplacements des serveurs" sur "Utiliser l'installation de tomcat" (l'écran s'ouvre lorsque vous double-cliquez sur tomcat dans la liste des serveurs)
  • démarrer tomcat en mode débogage

Cela fonctionne parfaitement pour moi de cette façon. Chaque changement non structurel est reflété immédiatement, sans redéploiement.

Mise à jour:
vous pouvez en savoir plus sur les méthodes de déploiement à chaud ici .
J'ai également créé un projet qui synchronise facilement l'espace de travail avec le conteneur de servlet.

Bozho
la source
@VladimirTsvetkov non - ce sont deux options distinctes
Bozho
J'essaie votre première approche mais j'utilise Maven Overlays et lorsque je change un fichier dans l'une des superpositions, le serveur est toujours redémarré (la superposition n'est pas un projet Web dynamique mais un module Web dynamique). Des idées?
Hoffmann
2
J'ai l'impression qu'en changeant «Publication» en «Ne jamais publier automatiquement» les JSP ne sont plus rechargées / recompilées lorsqu'elles sont modifiées. La partie de rechargement de classe fonctionne bien en démarrant Tomcat en mode débogage.
yglodt
5
Je le fais d'une autre manière: d'abord, changez pour publier automatiquement; deuxièmement, cliquez sur l' Modulesonglet dans la configuration du serveur, puis cliquez sur edit, décochez auto deploy enabled, je pense que c'est le moyen le plus simple. PS: votre premier chemin ne fonctionne pas pour moi.
hiway
@hiway, où se trouve cet onglet Modules dans l'onglet de configuration du serveur?
Mateus Viccari
30

Laissez simplement eclipse écrire les fichiers de classe directement dans le répertoire $ TOMCAT / webapps / MyWebApp / WEB_INF / classes. Ensuite, configurez apache-tomcat pour vérifier si les fichiers de classe ont été mis à jour et rechargez-les si c'est le cas.

Pour configurer tomcat pour recharger automatiquement une classe lorsqu'elle change, vous devez

modifier $TOMCAT/conf/context.xmlet définir:

<Context reloadable="true"> 

Vous devrez peut-être également modifier et recharger votre webapps/$YourWebApp/web.xmlfichier et inclure:

<web-app reloadable="true">

Je ne me souviens pas si les deux changements sont nécessaires, mais c'est ainsi que j'ai configuré mon tomcat-6.0.18 pour qu'il se recharge automatiquement.

Martin Tilsted
la source
Selon la documentation, tomcat.apache.org/tomcat-6.0-doc/config/context.html, ils recommandent de ne pas placer d' Contextéléments dans le fichier server.xml, mais il devrait surveiller / WEB-INF / classes / et / WEB-INF / lib pour tout changement. Où avez-vous lu sur l'attribut de l' web-appélément?
Michael
Désolé, vous avez un peu mal lu votre réponse. Le context.xml "doit être chargé pour chaque application Web".
Michael
2
Comment configurez-vous l'endroit où Eclipse écrit les fichiers de classe?
yglodt
7

Avertissement : je suis juste un client satisfait, je ne travaille pas pour Zero Turnaround et je ne suis en aucun cas affilié à eux.

Découvrez JRebel - il vous permet de coder sans redémarrage de l'application Web. Cela fonctionne essentiellement en instrumentant vos classes et en adaptant leurs changements. Il gère beaucoup plus de cas que le déploiement à chaud , notamment:

  • Ajout / suppression de méthodes
  • Ajout / suppression de constructeurs
  • Changer les interfaces
  • Ajout / suppression d'interfaces implémentées

C'est commercial , ( détails des prix , 550 $ / an à partir de juin 2018), et il a beaucoup de plugins pour les frameworks tiers, y compris:

  • Guice
  • Printemps
  • Jambes 2

Vous obtenez un essai gratuit sans douleur - je vous suggère d' essayer .

Robert Munteanu
la source
2
Jrebel, quand ça marche, ça marche. Quand ce n'est pas le cas, c'est un cauchemar. Je me cogne la tête avec leur soutien depuis plus d'une semaine et je n'arrive toujours pas à le faire fonctionner dans ma configuration simple de mvc à ressort. Ils ne m'aideront pas davantage sans que je leur envoie mon application ou un helloworld de mon application. ET, vos prix sont obsolètes - ils facturent maintenant une bombe. Dieu merci, je n'ai utilisé que leur version d'essai
happybuddha
Le prix actuel est de 365 $ / an / siège
Joseph Lust
Et maintenant son 550 $ / an / siège
frewper le
3

Changez votre espace de travail dans Eclipse en \ tomcat \ webapps Comme c'est juste pour votre travail, cela devrait fonctionner correctement. Les modifications que vous apportez à Eclipse se trouvent dans le même répertoire, tomcat recherche les applications à déployer

PaganSensei
la source
3

Dans la vue des serveurs, créez un nouveau serveur, n'ajoutez pas encore de ressource (projet) au serveur. Double-cliquez sur le serveur à l'emplacement des serveurs. Choisissez "Utiliser l'installation tomcat". Modifiez "Deploy path" dans le répertoire de déploiement de tomcat (Ex: c: \ server \ Tomcat 7.0.14 \ webapps). Développez la "section Publication". Cochez "Publier automatiquement après un événement de construction". Sauver et fermer. Dans le menu éclipse, cochez "Projet -> Construire automatiquement". Depuis la vue des serveurs, faites un clic droit sur votre serveur, "Ajouter et supprimer", publiez votre projet.

ticu0000
la source
2

Pourquoi ne pas utiliser un serveur tomcat intégré de with in eclipse si ce n'est que pour le développement? Vous pouvez configurer les serveurs sous window-> preferences. Une fois configuré, si vous avez un jsp appelé page.jsp, vous pouvez cliquer dessus avec le bouton droit de la souris et sélectionner Exécuter sur le serveur. Sous préférences-> général-> navigateur Web, vous pouvez choisir la météo pour utiliser le navigateur intégré ou un navigateur externe. Apportez des modifications à votre jsp, enregistrez et actualisez votre page à partir du navigateur. Les modifications seront automatiquement reflétées une fois que vous aurez enregistré et actualisé votre navigateur.

Jared
la source
2

Ce qui fonctionne pour moi ici, c'est:

context.xml comme ceci:

<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>

Puis, sur l'onglet Serveurs d'Eclipse, sur l'onglet "Modules", j'ai désactivé le "Rechargement automatique" de tous les modules en cours de déploiement.

Laissez également la configuration par défaut pour laisser la publication automatique.

Et si vous utilisez Maven avec WTP, n'oubliez pas de laisser le contenu de src / main / resources dedans, car Eclipse insiste pour exclure le contenu de ce dossier de la version finale.

Seulement avec tout cela, j'ai obtenu des classes (VM) complètes à déployer à chaud avec des ressources à déployer à chaud !!!

chuckedw
la source
1

Dans votre environnement de développement, pointez simplement votre serveur Tomcat pour qu'il recherche les JSP dans le répertoire dans lequel vous les développez. Dès que vous enregistrez le fichier, vous pourrez voir les modifications.

Cameron
la source
1

J'ai réussi à faire fonctionner cela sur mon environnement de développement à l'aide de l' agent JVM Spring Loaded . Bien que je développe des applications Web Spring, la description de ce projet mentionne qu'il est

utilisable sur n'importe quel bytecode pouvant s'exécuter sur une JVM

En utilisant la configuration suivante, j'ai pu obtenir des modifications à publier automatiquement sur une instance Tomcat attachée (la méthode habituelle Eclipse WTP). J'utilise Spring Tool Suite 3.7.3 basé sur Eclipse Mars.2 (4.5.2).

  1. Téléchargez la dernière version JAR de Spring Loaded à partir de leur projet Github . Cela a été testé avec springloaded-1.2.5.RELEASE.jar.
  2. Configurer un serveur Tomcat dans Eclipse comme d'habitude (testé avec Tomcat 8.0.30)
  3. Ouvrez la page de configuration du serveur Tomcat dans Eclipse (double-cliquez sur l'instance du serveur dans l'onglet "Serveurs").
  4. Dans la section "Options du serveur", décochez "Rechargement automatique des modules par défaut".
    • Remarque: Si vous avez déjà ajouté des modules Web au serveur, vous devrez peut-être désactiver le «rechargement automatique» sur eux individuellement via l'onglet «Modules» (en bas de la fenêtre de la page de configuration).
  5. Dans la section "Informations générales", cliquez sur "Ouvrir la configuration de lancement"
    • Dans l'onglet "Arguments", ajoutez ce qui suit à la fin des "arguments VM": -javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
    • Pour permettre la surveillance des JAR en plus des .classfichiers du projet , configurez l' -Dspringloaded=watchJars=argument VM en fonction des commentaires de ce problème .

Démarrez le serveur et publiez-y les projets d'application Web dynamique comme d'habitude. Encore une fois, j'ai pu tester cela avec les applications Web Spring. Par exemple, la modification du code, l'ajout / la soustraction de méthodes, etc. dans les classes @Controller ont été appliquées presque instantanément après avoir enregistré le fichier et les builds Eclipse et publié la classe modifiée. Enfin, la section FAQ du projet Spring Loaded a mentionné quelques cas où les choses ne se rechargent pas, donc cela nécessiterait un redémarrage du serveur / de l'application. Mais ces exceptions sont beaucoup moins fréquentes.

Une dernière remarque: cela ne fonctionne PAS avec le serveur Pivotal tc intégré ou le serveur VMware vFabric tc fourni avec STS. Pour ces serveurs, il existe une option «Activer le rechargement basé sur l'agent Java (expérimental)», mais qui utilise l'ancienne version 1.2.0 de Spring Loaded, qui ne fonctionnait pas pour moi.

martien111
la source
Il semble que vous devez prendre Springen compte, que diriez-vous de l' Non Springapplication.
Tangoo
Bien que vous ayez besoin que le JAR SpringLoaded soit configuré pour Tomcat, les applications en cours d'exécution elles-mêmes n'ont PAS besoin d'être des applications Spring (ni d'inclure des JAR Spring). J'ai testé cela avec succès avec un simple servlet HelloWorld.
martian111
0

Êtes-vous prêt à utiliser Jetty à des fins de développement?

Si tel est le cas, c'est assez simple à utiliser avec Maven - lancez simplement mvn jetty:run

mat b
la source
0

Ce n'est peut-être pas la meilleure façon, mais cela fonctionne pour moi.

  • $ tomcat / conf / Catalina / localhost / .xml
  • $ contextPath / webapp / web / WEB-INF / lib / *. jar
  • $ contextPath / webapp / web /
  • $ eclispeWorkbench / servlet-projet / src /
  • $ eclispeWorkbench / project-servlet / servlet.jardesc (devrait exporter jar vers lib dir dans $ contextPath)
  • $ eclipseWorkbench / projet-jsp /

J'utilise une commande rsync pour synchroniser les modifications de mon projet jsp vers le $ contextPath.

Utilisez le débogage à distance dans Eclipse pour Tomcat, ce qui permettra un échange à chaud limité du code. Si vous modifiez des champs statiques ou ajoutez des méthodes, vous devrez exporter le fichier jar et redémarrer le contexte.

TJR
la source
0

pouvons-nous utiliser l'option ci-dessous? Double-cliquez sur Serveur dans eclipse -> Emplacements des serveurs -> Utiliser l'installation de tomcat. Il prend le contrôle de l'installation de tomcat. Vous n'avez pas besoin de redémarrer le serveur pour les modifications des classes Java.

Tushar Sagar
la source
0

J'ai trouvé un moyen le plus simple: l'utilisation de liens symboliques: je pense que c'est le moyen le plus rapide car il n'y a pas de synchronisation du tout: le répertoire tomcat et le répertoire de votre projet seront toujours le même répertoire.

Tomcat détectera périodiquement les modifications et redéploiera votre application.

Il existe également un moyen de déboguer votre application, donc je pense humblement que c'est une bonne solution.

J'ai documenté ma solution ici , pour toute personne intéressée.

Raul Luna
la source
puis-je savoir pourquoi il est nécessaire d'utiliser une application java distante car elle utilise localhost, ce qui signifie que je débogue en utilisant ma propre machine locale
Karen Goh
0

Au cas où vous seriez pressé:

  1. cochez "ne jamais publier automatiquement" dans tomcat (autre conteneur) dans eclipse.
  2. démarrer tomcat (autre conteneur) en mode débogage.

voila! :)

Sachin Verma
la source
0

Dans Eclipse, cliquez sur le projet dans le menu supérieur et assurez-vous que «Construire automatiquement» est sélectionné. Cela a résolu mon problème. J'utilisais Eclipse avec Tomcat en utilisant les métadonnées de mon espace de travail. J'exécutais également Maven dans un projet de module Web dynamique. Pour vérifier, ajoutez votre application à Tomcat. Démarrez Tomcat depuis Eclipse. Assurez-vous que votre application est déployée et en cours d'exécution. Ouvrez l'onglet Console dans Eclipse. Faites un changement dans votre application. Après quelques secondes, vous devriez voir votre modification être automatiquement créée et déployée sur Tomcat.

NLessani
la source
-2

Le plus simple et le plus rapide: configurez Eclipse pour générer un fichier WAR lorsque vous construisez; comme étape de post-construction, copiez ce fichier WAR dans votre répertoire tomcat webapps. Tomcat reconnaîtra la modification et actualisera le site sans aucun déploiement nécessaire. Notez que ce n'est pas parfait; les utilisateurs utilisant cette application Web peuvent avoir une expérience moins qu'optimale, car Tomcat redémarre l'application Web «sous» eux; mais cela correspond à votre demande.

Paul Sonier
la source
1
ok ... je suppose que je n'ai pas précisé mes intentions. Je ne suis vraiment pas intéressé par le déploiement de l'application auprès de certains utilisateurs, mais j'essaie d'exécuter un tomcat avec éclipse pour mes besoins de développement quotidiens et de raccourcir le cycle de rétroaction de (apporter des modifications) -> (Voir le résultat) au lieu de (Faire Change) -> Deploy -> (Voir le résultat)
udit