我的应用程序上下文被定义为位于的 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
... 一切正常。但是当我使用以下 curl 语句指示 Tomcat 部署时,出现了失败。
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) 并且我整天都在 Google 上寻找答案,但没有找到任何可以帮助我解决此特定配置的东西。
感觉好像选择是:
- 启用自动部署的 Tomcat(不推荐用于生产),在这种情况下,只需删除新的 WAR 就会
/my/path/to/myApp/
导致 Tomcat 热部署应用程序。 - Tomcat 的自动部署已关闭,但重新部署需要重新启动 Tomcat,因为部署 API 似乎没有按宣传的那样工作。
有人用这个配置完成过这个工作吗?
编辑:
我打开了 Catalina 上的日志记录。当我运行第一个不带路径的部署命令时,我得到了以下一组日志条目:
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 问题直到它被解决,因为这个 serverfault 问题成为了它的重复。