Tomcat 8 не может быть развернут с помощью скрипта Ant

Версия Tomcat: 8.0.43

ОС: Виндовс 10

URL-адрес моего развертывания: http://localhost:8080/manager/text

Мои учетные записи пользователей, похоже, настроены правильно, так как я могу без проблем получить доступ к веб-интерфейсу.

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <user username="user" password="pass" roles="manager-gui,manager-script"/>
</tomcat-users>

Когда я пытаюсь вручную получить доступ к этому URL-адресу развертывания в браузере, у меня нет проблем, и я вижу это в своих журналах.

user [08/Oct/2018:12:51:15 -0700] "GET /manager/text/deploy?path=/apc HTTP/1.1" 200 69

Когда я пытаюсь выполнить развертывание через Ant, я получаю следующую ошибку и запись в журнале с неавторизованным HTTP-кодом 401.

<target name="deploy" description="Install web application" depends="dist">
    <deploy url="http://localhost:8080/manager/text" username="user" password="pass"
        path="/apc" war="dist/apc.war"/>
</target>


java.io.IOException: Error writing request body to server
        at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3536)
        at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3519)
        at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
        at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:238)
        at org.apache.catalina.ant.DeployTask.execute(DeployTask.java:194)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
        at org.apache.tools.ant.Task.perform(Task.java:350)
        at org.apache.tools.ant.Target.execute(Target.java:449)
        at org.apache.tools.ant.Target.performTasks(Target.java:470)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1388)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1361)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
        at org.apache.tools.ant.Main.runBuild(Main.java:834)
        at org.apache.tools.ant.Main.startAnt(Main.java:223)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:284)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:101)
        Suppressed: java.io.IOException: insufficient data written
                at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.close(HttpURLConnection.java:3558)
                at java.io.FilterOutputStream.close(FilterOutputStream.java:159)
                at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:241)
                ... 17 more

- [08/Oct/2018:12:52:14 -0700] "PUT /manager/text/deploy?path=%2Fapc HTTP/1.1" 401 2473

Странно то, что моя команда Undeploy Ant прекрасно работает с тем же именем пользователя и паролем. Итак, если я вручную разверну свой WAR, я могу успешно отменить развертывание с помощью этой команды.

<target name="undeploy" description="Remove web application">
        <undeploy url="http://localhost:8080/manager/text" username="user" password="pass"
            path="/apc"/>
    </target>

user [08/Oct/2018:12:47:34 -0700] "GET /manager/text/undeploy?path=%2Fapc HTTP/1.1" 200 61

Итак, кажется, что мое имя пользователя и пароль верны, но по какой-то причине развертывание не распознает их как действительные.

Следует отметить, что записи журнала для моих успешных попыток ручного доступа и отмены развертывания показывают user перед записью. Вместо неудачной записи журнала для развертывания отображается -. Не знаю, что это значит, но может быть важно.

ОБНОВЛЕНИЕ: похоже, что это может быть как-то связано с файлами библиотеки tomcat 8. В настоящее время я использую JAR-файлы catalina-ant, tomcat-coyote, tomcat-util в своем пути к классам для запуска своего сценария ant. Если я использую библиотеку, предоставленную в Tomcat 8, у меня есть эти ошибки выше. Если вместо этого я использую библиотеки из старой установки Tomcat 7, то все работает нормально.


person Raymond Holguin    schedule 10.10.2018    source источник
comment
Если то, что вы говорите, верно, то я предполагаю, что когда вы делаете "deploy", он использует пользователя -, а когда вы используете undeploy, он использует правильного пользователя, то есть user, вы можете подтвердить это, используя следующую команду в своем муравье <echo>User is: ${username}</echo>   -  person rohit thomas    schedule 22.10.2018
comment
Кроме того, единственная разница между двумя командами - depends="dist", поэтому вам, возможно, придется также проверить зависимость   -  person rohit thomas    schedule 22.10.2018
comment
Имя пользователя и пароль @rohitthomas правильно отображаются в сценарии развертывания. Я удалил зависимость dist, чтобы проверить, и все еще имею ту же проблему.   -  person Raymond Holguin    schedule 22.10.2018
comment
@rohitthomas, пожалуйста, смотрите обновление в ОП. Собираюсь попробовать обновить Tomcat до последней версии 8.0.x   -  person Raymond Holguin    schedule 22.10.2018


Ответы (1)


Известно, что поддержка аутентификации нарушена во всех версиях Tomcat 8.0, более поздних, чем 2017-05-30 (8.0.45 и более поздние версии) — см. выпуск №62809.

Проблема №62809 устранена в Tomcat 9.0.13, 8.5.35, 7.0.92. Это не было исправлено в Tomcat 8.0, поскольку срок службы Tomcat 8.0 уже истек.

Для справки: r1796838, r1843992.

в java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
в org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:238)

Приведенные выше номера строк относятся не к Tomcat 8.0.43, как вы утверждаете, а к 8.0.45 или более поздней версии. В версии 8.0.43 вызов "ostream.write(..)" находится в строке 242 файла AbstractCatalinaTask. В 8.0.45+ он находится в строке 238.

person Konstantin Kolinko    schedule 23.10.2018
comment
Вы абсолютно правы, я использую 8.0.47. У меня была установлена ​​версия 8.0.43, и я думаю, что все еще думал об этом номере, когда писал. Спасибо. - person Raymond Holguin; 23.10.2018