J'ai une certaine application, qui a la capacité de se mettre à jour. Ses téléchargements Le fichier JAR du net, puis essaie de remplacer le bocal utilisé pour exécuter cette application par téléchargé une. Mais je ne peux pas faire cela, car le fichier est verrouillé par Windows, car l'application est toujours en cours d'exécution. P>
Est-ce que quelqu'un connaît une solution de contournement de cela? P>
4 Réponses :
Je pense que la bonne chose à faire ici est de
L'une des solutions populaires pour cela consiste à exécuter votre programme de mise à jour en tant que programme distinct. Avez-vous déjà remarqué que Firefox doit redémarrer lorsqu'il est mis à jour? Eh bien, c'est parce qu'un processus séparé (updater.exe) met à jour les fichiers, puis commencez Firefox à nouveau. P>
Vous pouvez essayer cette approche. Le seul obstacle que je vois dans la voie, c'est essayer d'automatiser le programme principal de se fermer. Le seul moyen portable de faire cela (dans ma tête) est destiné à l'application principale d'attendre un signal de jeu via une prise locale et que le programme de mise à jour puisse envoyer la commande via la mise en réseau locale. Une autre chose que vous devez envisager est que le programme de mise à jour doit fonctionner dans un processus Java distinct. Si votre programme principal crée simplement un nouvel objet de mise à jour, le programme de mise à jour coexistera avec le JVM du programme principal, qui vous ramène à Square One. P>
Un moyen typique de le faire consiste à écrire un point de vue distinct qui sera invoqué par votre programme principal lorsqu'il voit une mise à jour. À ce stade, votre programme principal peut démarrer le programme de mise à jour dans un nouveau processus et sortir. Votre programme de mise à jour peut attendre que le programme principal quitte, téléchargez et copiez les fichiers mis à jour et redémarrez votre programme principal P>
C'est un problème Le vrai problème n'est pas de charger une nouvelle version de JAR. Cela pourrait être fait avec votre propre chargeur de classe qui libère le verrouillage du fichier. Le vrai problème est de savoir comment Poignée des instances de différentes versions de la même classe . p>
Le redémarrage omett ces problèmes. Si vous avez vraiment besoin de différentes versions de JAR dans une application, utilisez OSGI. P>