De plus Edit:
Je scrutais le web et suis tombé sur cet excellent article qui peut également avoir une incidence sur votre question: http://www.szegedi.org/articles/remotejars.html
Dans ce cas, la plupart de ce que j'ai écrit ci-dessous est hors de propos , mais je vais le laisser de toute façon juste au cas où.
Edit:
Ok, je pense que je vais avoir une meilleure idée de vos besoins. Les exigences sont délicates, alors laissez-moi vous dire ce que je pense que vous essayez de faire, et ensuite je verrai quelles solutions cela suggère. Je vais probablement me tromper, alors on recommence.
Exigences:
Un mécanisme de mise en cache distribuée pour servir les applications webstart. Les applications (.jars) changent régulièrement. Ils sont autonomes.Vous voulez avoir un cache local capable de servir les fichiers jar Webstart obtenus à partir d'un serveur central, en les gardant en mémoire. Je ne comprends pas vos exigences pour Exit.
Solutions? Ce que vous cherchez peut-être est un serveur Web qui peut héberger une application Web qui lira en mémoire les jars d'application mis à jour, puis les servira au lanceur Webstart. Vous devrez utiliser un serveur Web tel que Jetty/Tomcat, et écrire une simple application web pour l'exécuter. La webapp interrogera le serveur central pour les mises à jour de l'application, et mettra les jars de l'application à la disposition de webstart via les URL qu'elle sert. Il est probablement plus logique d'interroger le serveur central que de faire en sorte que le serveur central envoie de nouvelles applications aux serveurs locaux pour des raisons de pare-feu et d'évolutivité.
Je ne connais pas de webapps prêtes à l'emploi qui le font, il y en a peut-être une.
Mais comme je l'ai dit, je n'ai probablement toujours pas compris. Exigences: doit les aimer. Je vais faire quelques hypothèses dans cette réponse, en fonction de votre question. Il semble que vous souhaitiez mettre en cache "app.jar" depuis la machine distante, pour la durée de vie de "load.jar" sur la machine locale, afin de permettre d'isoler "load.jar" des modifications apportées à "app.jar" "Au cours de sa vie. Cela semble être une bonne idée: je m'attendrais à ce que si vous utilisez un URLClassLoader pour apporter "app.jar" dans l'espace "load.jar", alors une mise à jour à mi-chemin de l'exécution pourrait faire des ravages.
Il semble aussi que vous ne voulez pas que "load.jar" fasse une copie sur disque de "app.jar" - Je pense que c'est un objectif raisonnable: qui veut avoir de vieux fichiers jar éparpillés sur la machine? qui veut des problèmes d'autorisation liés à la tentative d'écriture de fichiers temporaires? Etant donné ces objectifs, vous devez trouver ou implémenter un chargeur de classe qui crée un instantané de "app.jar" lorsque "load.jar" frappe une classe à l'intérieur. Ce n'est pas difficile: j'ai dû faire quelque chose de similaire dans mon JarClassLoader One-JAR, qui charge les fichiers Jar depuis l'intérieur des fichiers Jar. Au démarrage, il charge tous les octets trouvés dans la mémoire, puis résout les classes à la demande en utilisant ce magasin de mémoire. Bien que moins efficace que le chargement paresseux, il est rapide et stable et résoudrait votre problème.
Malheureusement, One-JAR ne permet pas aux ressources réseau (ou fichier) d'être mises en cache de cette manière. Il utilise la délégation via un chargeur de classe d'URL normal, ce qui le rendrait pas en cache vos ressources distantes.
Je vous suggère de jeter un oeil sur le référentiel CVS: http://one-jar.cvs.sourceforge.net/viewvc/one-jar/one-jar/src/com/simontuffs/onejar/JarClassLoader.java?revision=1.58&view=markup
autour de la ligne 678. Ne vous laissez pas intimidés par la taille de cette classe, est un groupe de cas particuliers à traiter, ainsi, des cas particuliers. Si je devais créer quelque chose à partir de zéro, je sous-classerais URLClassLoader, remplacerait les méthodes loadClass, getResource, et findResource (voir par exemple la ligne 281 où One-JAR fait cela pour ses propres inversion de classes), dans la mise en cache de bytecode en chargeant le "app.jar" entier dans la mémoire comme hashmap de tableau d'octets indexé par les clés de nom de classe/ressource (ceci est One-JAR encore), et alors vous seriez mis en cache en mémoire.
J'espère que cela aide.
--simon.
(Comme il arrive 'URLClassLoader' met toujours en cache pour le disque, car sans raison valable.) –