2009-08-05 6 views
1

J'écris une application à mise à jour automatique. La première fois qu'il s'exécute, il installe une bibliothèque native sur l'ordinateur du client, de sorte qu'ils n'ont pas besoin de le télécharger à chaque fois. Lorsqu'il détecte que la version de la bibliothèque installée est antérieure au nouveau minimum requis, il télécharge et installe le nouveau.Comment remplacer une bibliothèque dynamique chargée dans une applet Java sans nécessiter un redémarrage complet du navigateur?

Le problème est que la nouvelle bibliothèque n'est pas utilisée par Java jusqu'à ce que l'utilisateur ferme et redémarre le navigateur (pas l'onglet, le navigateur entier). C'est quelque chose que j'essaie d'éviter - c'est OK si l'utilisateur a besoin d'actualiser la page, ou de la fermer et de l'ouvrir à nouveau, cependant.

J'ai essayé de copier la bibliothèque installée dans un dossier temporaire chaque fois que l'applet démarre, puis de toujours charger cette copie, en vain. Est-ce que quelqu'un ici a déjà fait ça? Des bonnes idées? Le système d'exploitation est Linux, JDK 1.5, Firefox.

Merci!

Répondre

1

C'est exactement la situation décrite dans le présent rapport de bogue: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5075039 (le rapport dit qu'il applique à Windows, mais il est en fait un problème Java)

il n'y a aucun moyen pour le code Java pour décharger un dll natif jusqu'à ce que la VM se termine. Une fois qu'une DLL est chargée, elle est là pour la durée de vie de la JVM et la VM veillera à ce qu'elle soit chargée une fois et une seule fois.

La seule façon que je peux voir pour que votre scénario fonctionne est si vous pouvez en quelque sorte faire votre version vérifier et mettre à jour avant le dll est chargé. Une fois qu'il est utilisé, vous êtes coincé avec.

0

Les classes Java peuvent uniquement être déchargées en déchargeant le chargeur de classe qui les possède. Étant donné que les bibliothèques JNI dépendent de la classe propriétaire, vous devrez peut-être décharger le chargeur de classe pour la classe propriétaire de la bibliothèque.

Essayez d'instancier un URLClassLoader pour la classe qui s'interface avec la bibliothèque JNI et de créer des instances de la classe en question avec la réflexion. Lorsque vous voulez le décharger, créez un nouveau chargeur de classe, à partir d'un JAR mis à jour, qui fait référence à la nouvelle version de la bibliothèque (utilisez un nom de fichier différent pour pouvoir charger les deux versions simultanément jusqu'à ce que le GC prenne soin de l'ancien)