Как развернуть приложение Tomcat с помощью API URL-адреса менеджера при использовании пользовательского контекста XML

Как развернуть приложение Tomcat с помощью API URL-адреса менеджера при использовании пользовательского контекста XML

Контекст моего приложения определен как XML-файл, расположенный в my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml.

<Context docBase='/my/path/to/myApp/myAppWarFile.war'>
   <Environment name='my_config_dir' value='/my/path/to/myApp' type='java.lang.String'/>
</Context>

/my/path/to/myAppсодержит WAR-файл myAppWarFile.war и ряд внешних свойств, которые считываются Spring.

Tomcat настроен с отключенным autoDeploy. Когда я запускаю Tomcat, он создает my/path/to/Tomcat/conf/webapps/my-app/и распаковывает файл WAR в это место, как и ожидалось, и приложение, конечно, может работать, как и ожидалось.

Когда я хочу развернуть новую версию без перезапуска Tomcat, я запускаю команду undeploy следующим образом:

curl http://localhost:8080/manager/text/undeploy?path=/my-app --user my-username:my-password

... и это работает. Но когда я даю команду Tomcat выполнить развертывание с помощью следующего оператора curl, я получаю ошибку.

curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml --user my-username:my-password
# Tomcat response
FAIL - Invalid context path null was specified

Добавление пути не особо помогает, все равно получаю ошибку.

curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml\&path=/my-app --user my-username:my-password

# Tomcat response
FAIL - Failed to deploy application at context path /my-app

Хуже всего то, что отслеживание catalina.out не дает никакой информации. И вдобавок ко всему, Tomcat удаляет XML-файл контекста приложения my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml!

Естественно, я просмотрел документацию Tomcat (https://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html#Deploy_using_a_Context_configuration_%22.xml%22_file) и я целый день гуглил, чтобы разобраться в этом, но не нашел ничего, что могло бы мне помочь с этой конкретной конфигурацией.

Такое ощущение, что выбор таков:

  1. Tomcat с включенным autoDeploy (не рекомендуется для производства), в этом случае простое размещение нового WAR-файла /my/path/to/myApp/заставит Tomcat выполнить горячее развертывание приложения.
  2. Tomcat с отключенным autoDeploy, но для повторного развертывания требуется перезапуск Tomcat, поскольку API развертывания, похоже, не работает так, как заявлено.

Кто-нибудь заработал с этой конфигурацией?

РЕДАКТИРОВАТЬ:

Я включил логирование на Catalina. Когда я запускаю первую команду deploy без пути, я получаю этот набор записей в логе:

FINE: Start processing with input [config=file:/my/apth/to/tomcat/conf/Catalina/localhost/my-app.xml]
Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [OPEN]
Oct 13, 2015 10:04:53 AM org.apache.coyote.http11.AbstractHttp11Processor process
FINE: Error parsing HTTP request header
java.io.EOFException: Unexpected EOF read on the socket
    at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:168)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:982)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:744)

Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [CLOSED]
Oct 13, 2015 10:04:53 AM org.apache.tomcat.util.threads.LimitLatch countDown
FINE: Counting down[http-bio-8080-exec-16] latch=1

решение1

Проблема распространенная. В случае с двоичными переносимыми файлами war конфигурация контекста (среда) находится в контексте, где она должна быть, а не в файле war. При повторном развертывании, например, при применении программного патча, контейнер (Tomcat) должен повторно развертываться без удаления контекста.

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

Предлагаемое решение — следить за этой проблемой Tomcat до тех пор, пока она не будет решена, поскольку эта проблема с ошибкой сервера становится ее дубликатом.

Связанный контент