Обновление файла Tomcat WAR в Windows

Я унаследовал веб-приложение Maven/Tomcat (8.5), которое локально размещено на разных машинах. Я пытаюсь заставить приложение обновляться из файла войны, который либо хранится локально (на USB-накопителе), либо более надежно загружается с AWS в Windows. В версии для Linux программное обеспечение может загрузить новый файл войны через curl с помощью manager-script, выполнив следующие действия:

        String url = "http://admin:secret@localhost:8080/manager/text/deploy?path=/foo&update=true";
        CommandRunner.executeCommand(new String[] { "curl", "--upload-file", war, url });

Для Windows текущий текущий метод пытается скопировать военный файл в каталог /webapps, и tomcat автоматически развертывает новый военный файл после перезапуска tomcat или хост-компьютера. Проблема в том, что скопированный военный файл имеет размер 0 КБ, и развертывать нечего. Похоже, это происходит за пределами моей функции установки, потому что размер файла после FileUtils.copyFile() для /webapps/foo.war является правильным размером.

Я попытался реализовать запрос PUT для рулона manager-script, прочитав документы менеджера Tomcat и другой пост:

    File warfile = new File(request.getWar());
    String warpath = warfile.getAbsolutePath().replace("\\", "/");

    //closes other threads
    App.terminate();

    String url = "http://admin:secret@localhost:8080/manager/text/deploy?path=/foo&war=file:" + warpath + "&update=true";
    HttpClient client = HttpClientBuilder.create().build();
    HttpPut request;
    try {
            request = new HttpPut(url);

            HttpResponse response = client.execute(request);
            BufferedReader rd = new BufferedReader(
                            new InputStreamReader(response.getEntity().getContent()));

            StringBuffer result = new StringBuffer();
            String line = "";
            while ((line = rd.readLine()) != null) {
                    result.append(line);
            }

            System.err.println(result.toString());
        } catch (Exception e){
            LOGGER.info("war install failed");
            throw new ServiceException("Unable to upload war file.", e);
        }

Однако процесс по-прежнему заканчивается военным файлом размером 0 КБ для /webapps. Единственная ошибка в моем журнале — когда tomcat пытается развернуть пустую войну. Я попытался ослабить права на чтение/запись файлов в моей установке tomcat, и это, похоже, не помогает. Я также не знаю, могу ли я гарантировать, что все установки Windows будут иметь доступ к curl, если я попробую эту реализацию. Кто-нибудь сталкивался с подобными проблемами? Спасибо за помощь!


person Dardin-dale    schedule 07.04.2020    source источник
comment
Обновление: так что я не смог заставить это работать. Я не понял, что делает завиток, который я не могу воспроизвести. Я смог покопаться в записях компании и просто определить, что все машины с Windows, на которых я установлен, имеют предыдущую версию 1803, где curl стал стандартным в Windows. Я использовал Java Runtime для выполнения приведенной выше команды curl. Так что, если кто-то наткнется здесь, я рекомендую сначала попробовать это.   -  person Dardin-dale    schedule 23.04.2020


Ответы (1)


Уилл, вы наверняка открываете файл, но ничего в него не пишете, результирующая строка записывается в стандартный вывод, поэтому вам нужно заменить System.err.println(result.toString()); с fr = новый FileWriter (файл); br = новый BufferedWriter(fr); бр.записать(результат); и не забудьте закрыть свои ресурсы в конце (br.close(); fr.close(); ) :) PS: проверьте, есть ли какая-то информация для фильтрации (заголовки или подобный персонал)

person bfsMed    schedule 08.04.2020
comment
Я думал, что результат был просто ответом на запрос пут, верно? Перезапись и развертывание файла должны выполняться сценарием менеджера tomcat в соответствии с запросом на размещение. В любом случае, я попробовал ваше предложение без успеха. Я попытался добавить файл войны как FileEntity в запрос на размещение, но столкнулся с ошибкой записи сокета. - person Dardin-dale; 09.04.2020