Я пишу простой (общий) оболочный Java-класс, который будет выполняться на разных компьютерах отдельно от развернутого веб-сервера. Я хочу загрузить последнюю версию файла jar, который является приложением с этого связанного веб-сервера (в настоящее время Jetty 8).Интеллектуально обслуживающие файлы jar с веб-сервера
У меня есть такой код:
// Get the jar URL which contains the application
URL jarFileURL = new URL("jar:http://localhost:8081/myapplication.jar!/");
JarURLConnection jcl = (JarURLConnection) jarFileURL.openConnection();
Attributes attr = jcl.getMainAttributes();
String mainClass = (attr != null)
? attr.getValue(Attributes.Name.MAIN_CLASS)
: null;
if (mainClass != null) // launch the program
Это работает хорошо, за исключением того, что myapplication.jar большая баночка файл (OneJar jarfile, так много находится там). Я хотел бы, чтобы это было максимально эффективно. Файл jar не будет меняться очень часто.
- Может ли файл jar быть сохранен на диск (я вижу, как получить объект JarFile, но не для его сохранения)?
Что еще более важно, но связанное с №1, может ли файл jar быть кэширован каким-то образом?
2.1 Могу ли я (легко) запросить MD5 файла jar на веб-сервере и загрузить его только после того, как это изменилось?
2.2 Если нет другого механизма кэширования, может потребоваться только манифест? Информация о версии/сборке может быть сохранена там.
Если кто-нибудь сделал что-то подобное, вы могли бы набросать на детали, что делать дальше?
ОБНОВЛЕНИЕ НА ПЕРВЫХ ОТВЕТЫ
Предложение заключается в том, чтобы использовать If-Modified-Since заголовка в запросе и методе Openstream на URL, чтобы получить файл банка, чтобы сохранить.
Основываясь на этой обратной связи, я добавил одну важную часть информации и некоторые более сфокусированные вопросы.
Программа java, описанная выше, запускает программу, загруженную из файла jar, на который делается ссылка. Эта программа будет работать от 30 секунд до 5 минут или около того. Затем выполняется и завершается. Некоторые пользователи могут запускать эту программу несколько раз в день (скажем, до 100 раз), другие могут запускать ее нечасто, как раз в неделю. Он должен быть достаточно умным, чтобы знать, имеет ли он самую последнюю версию файла jar.
более сфокусированные Вопросы:
Будет ли If-Modified-Since заголовок все еще работает в этом использовании? Если да, мне нужен совершенно другой код, чтобы добавить это? То есть, можете ли вы показать мне, как изменить представленный код, чтобы включить это? Тот же вопрос в отношении сохранения файла jar - в конечном счете, я действительно удивлен (разочарован!), Что могу получить объект JarFile, но не могу его сохранить - мне даже понадобится класс JarURLConnection?
Bounty Вопрос
Я сначала не понимаю, точный вопрос, который я пытался спросить. Это:
Как сохранить файл jar с веб-сервера локально в программе командной строки, которая выходит и ТОЛЬКО обновляет этот файл jar, когда он был изменен на сервере?
Любой ответ, который, по примерам кода, показывает, как это может быть сделано, будет присуждена награда.
Вы можете использовать ' If-Modified-Since' в вашем запросе GET, и сервер ответит 304, если файл не изменился. – fge
Почему бы просто не использовать DefaultServlet для обслуживания файлов с сервера Jetty, а затем на стороне клиента пройти в текущем временная метка lastModified файловой системы как заголовок HTTP-запроса 'If-Modified-Since'. Нет смысла изобретать колесо на этом. –
@Joakim Erdfelt - это звучит хорошо и хорошо, но я совершенно не знаю, как это сделать! У вас есть указатель на статью или другой вопрос? Благодаря! – JoeG