Дальнейшее редактирование:
Я просканировал сеть и наткнулся на эту прекрасную статью, которая также может иметь отношение к вашему вопросу: http://www.szegedi.org/articles/remotejars.html
В этом случае большая часть того, что я написал нижене имеет значения, но я все равно оставлю это на всякий случай.
Редактировать:
Хорошо, я думаю, что я получаю лучшее представление о ваших требованиях.Требования, однако, хитры, поэтому позвольте мне рассказать вам, что я думаю, что вы пытаетесь сделать, и затем я посмотрю, какие решения предлагает.Я, вероятно, пойму это неправильно, тогда мы сделаем это снова.
Требования:
Механизм распределенного кэширования для обслуживания приложений WebStart.Приложения (.jars) меняются регулярно.Они автономны.Вы хотите иметь локальный кэш, способный обслуживать файлы JAR Webstart, полученные с центрального сервера, сохраняя их в памяти.Я не понимаю ваших требований к выходу.
Решения?
Вам может потребоваться веб-сервер, на котором можно разместить веб-приложение, которое будет считывать обновленные банки приложений в память, а затем обслуживать их.их на веб-запуск.Вам нужно будет использовать веб-сервер, такой как Jetty / Tomcat, и написать простое веб-приложение для запуска под ним.Веб-приложение будет опрашивать центральный сервер на предмет обновлений приложения и сделает файлы приложения доступными для веб-запуска через URL-адреса, которые он обслуживает.Опрос центрального сервера, вероятно, имеет больше смысла, чем когда центральный сервер отправляет новые приложения на локальные серверы из-за брандмауэра и масштабируемости.
Я не знаю ни одного готового веб-приложения, которое бы делало это, может быть одно.
Но, как я уже сказал, я, вероятно, все еще не понимаю этого.Требования: надо любить их.
Я собираюсь сделать некоторые предположения в этом ответе, основываясь на вашем вопросе.Звучит так, как будто вы хотите кэшировать «app.jar» с удаленной машины на время существования «load.jar» на локальной машине, чтобы позволить изолировать «load.jar» от изменений в «app.jar»."в течение своей жизни.Это кажется хорошей идеей: я ожидаю, что если вы используете URLClassLoader для переноса «app.jar» в пространство «load.jar», то обновление в середине выполнения может привести к хаосу.
Также звучит так, как будто вы не хотите, чтобы «load.jar» делал копию «app.jar» на диске - я думаю, что это разумная цель: кто хочет, чтобы старые файлы jar были разбросаны помашина?кто хочет проблемы с разрешением, связанные с попыткой записи временных файлов?
Учитывая эти цели, вам нужно найти или реализовать загрузчик классов, который делает снимок «app.jar», когда «load.jar» впервые попадает в класс внутри него.Это не сложно: мне пришлось сделать нечто подобное в моем One-JAR JarClassLoader, который загружает файлы Jar изнутри файлов Jar.Во время запуска он загружает все найденные байты в память, а затем разрешает классы по требованию, используя это хранилище памяти.Хотя это, возможно, менее эффективно, чем отложенная загрузка, оно быстрое и стабильное и может решить вашу проблему.
К сожалению, One-JAR не позволяет сетевым (или файловым) ресурсам кэшироваться таким образом.Он использует делегирование через обычный загрузчик классов URL-адресов, что делает его не кэширующим ваши удаленные ресурсы.
Я предлагаю вам взглянуть на хранилище CVS: http://one -jar.cvs.sourceforge.net/viewvc/one-jar/one-jar/src/com/simontuffs/onejar/JarClassLoader.java?revision=1.58&view=markup
около строки 678. Не пугайтесь размераэтого класса, это куча особых случаев для обработки, ну, в частности, особых случаев.
Если бы мне пришлось создавать что-то с нуля, я бы создал подкласс URLClassLoader, переопределил методы loadClass, getResource и findResource (см., Например, строку 281, где One-JAR делает это для своих собственных нужд инверсии загрузчика классов)вставьте кэширование байт-кода, загрузив весь «app.jar» в память в виде хэш-таблицы байтового массива, индексируемой ключами имен классов / ресурсов (снова это One-JAR), и затем вы будете кэшированы в памяти.
Надеюсь, это поможет.
-. Симон