Обновление файла WAR Tomcat в Windows - PullRequest
1 голос
/ 08 апреля 2020

Я унаследовал веб-приложение Maven / Tomcat (8.5), которое локально размещается на разных машинах. Я пытаюсь заставить приложение обновляться из файла war, который либо хранится локально (на USB-накопителе), либо более надежно загружается с AWS на Windows. В версии Linux программное обеспечение может загружать новый файл war через 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 текущий текущий метод пытается скопировать поверх файла war в каталоге /webapps и tomcat автоматически развернет новый файл war после перезапуска tomcat или хост-машины. Проблема в том, что скопированный файл war заканчивается размером 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, если я попробую эту реализацию. Кто-нибудь сталкивался с подобными проблемами? Спасибо за помощь!

1 Ответ

0 голосов
/ 08 апреля 2020

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

...