9 votes

Mise à jour du code Java en cours d'exécution

Il y a environ un an, je suis tombé sur une fonctionnalité intéressante de Java que je n'arrive pas à retrouver.

Grâce à une interface magique, il était apparemment possible de déclarer certaines classes ou fonctions remplaçables pendant l'exécution.
J'ai trouvé un bel exemple dans le guide de quelqu'un qui a exécuté un petit programme simple qui imprimait un certain message, il a ensuite mis à jour le programme en utilisant une méthode dont je ne me souviens plus et tout d'un coup le programme a remplacé l'ancienne fonction d'impression par une nouvelle.

J'ai essayé de consulter l'API Java pour me rafraîchir la mémoire et j'ai fait des recherches sur Google, mais sans succès. Quelqu'un peut-il m'aider ?

8voto

Jon Skeet Points 692016

Différents conteneurs d'applications peuvent le faire.

En fait, vous devez recharger la classe dans un nouveau fichier ClassLoader (à moins que vous ne souhaitiez le faire sous le débogueur, auquel cas il existe des API complètement différentes).

À mon avis, ce genre de choses vaut rarement la peine : il est beaucoup plus difficile de tout concevoir pour qu'il puisse être rechargé que de le concevoir pour qu'il puisse être complètement redémarré dans un nouveau processus. Il est également plus facile de savoir exactement quel code est exécuté s'il n'y a jamais qu'une seule version chargée dans le processus.

C'est une bonne chose de pouvoir faire des démonstrations, mais pour l'instant, il n'y en a pas. le plus les applications n'en valent pas la peine. Tout cela à mon avis, bien sûr :)

Une exception notable est la possibilité de recharger les couches de l'interface web sans redémarrer le conteneur : cela peut rendre la vie plus difficile aux utilisateurs. mucho plus facile.

6voto

ewernli Points 23180

En Remplacement à chaud a été ajoutée à Java 1.4 et permet au fichier de classe remplacement au moment de l'exécution. Cette fonctionnalité est fournie par l'intermédiaire de la fonction redefineClasses de la méthode instrumentation l'emballage. Je pense que vous pouvez également le faire par l'intermédiaire de l'outil JPDA l'interface.

Voici également une référence à ce que je crois être le document de recherche qui a décrit le mécanisme HotSwap en premier :

Sinon, vous pouvez utiliser Chargeur de classe comme les autres mentionnés, mais il ne prévoit que chargement dynamique des classes pas de remplacement. La même classe chargée deux fois sera considérée comme deux types différents. Combinée à une interface et/ou à un peu de réflexion, elle peut cependant fournir des moyens de mettre à jour l'application au moment de l'exécution.

Voici une référence à un excellent article sur les chargeurs de classe et leur utilisation :

Je ne m'étendrai pas sur la question de savoir si c'est une bonne ou une mauvaise chose, car ce n'était pas votre question, mais je pense que c'est une bonne chose d'avoir un support pour l'évolution des logiciels en cours d'exécution. JSR-117 ne l'a jamais fait !

1voto

Peter Tillemans Points 20129

C'est typiquement le genre de fonctionnalité que je laisse volontiers à l'infrastructure, car il est difficile de bien faire les choses et facile de se tromper. Comme Jon l'a mentionné plus haut, le plus n'en ont pas besoin et pour ceux qui en ont besoin, l'infrastructure est disponible.

La plupart des serveurs d'application permettent aujourd'hui un déploiement à chaud et, de la même manière, la plupart des serveurs d'application sont intégrables et permettent d'être dépouillés pour supprimer les fonctions dont vous n'avez pas besoin.

S'il s'agit principalement d'un projet de développement, vous devriez chercher une JRebel qui fournit cette fonctionnalité de manière transparente. J'ai entendu dire qu'ils travaillaient sur une solution d'exécution, mais je ne sais pas si elle est déjà prête pour le primetime.

Si vous êtes vraiment motivé pour que cela fonctionne, envisagez d'utiliser OSGi. La courbe d'apprentissage est raide, mais une fois que vous l'avez comprise, elle fait la plupart des choses correctement et fonctionne très bien. J'ai trouvé le outils pax est un bon point de départ, mais la chaîne d'outils d'Eclipse offre également un bon support.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X