java - 使用自定义上下文 XML 时如何使用 URL API 部署 Tomcat 应用程序

标签 java spring tomcat

我的应用程序上下文定义为位于 my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml 中的 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 配置为关闭自动部署。当我启动 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),并且我搜索了一整天以解决这个问题,但我没有找到任何可以帮助我进行此特定配置的内容。

感觉好像选择是:

  1. Tomcat 启用了自动部署(不推荐用于生产),在这种情况下,只需将新的 WAR 放到 /my/path/to/myApp/ 就会导致 Tomcat 热部署应用程序。
  2. 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

最佳答案

你试过吗:

curl --upload-file /my/path/to/my-app.war http://localhost:8080/manager/text/deploy?path=/my-app --user my-username:my-password

关于java - 使用自定义上下文 XML 时如何使用 URL API 部署 Tomcat 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32877935/

相关文章:

java - 仅使用一种颜色生成渐变

java - 避免额外的换行,写入 .txt 文件

java - 使用 SAML 重定向未登陆我的配置页面

tomcat - 什么标准定义了 faces-config.xml 的内容? - 在所有错误的地方寻找医生

java - Tomcat:严重:加载 WebappClassLoader 时出错

java - 如何从一组形成直线的点中获取曲线的控制点?

java - Jersey :如何使用自定义 `ExceptionMapperFactory`

java - python cli 中的 java BCryptPasswordEncoder() 等效于什么?

java.lang.NoSuchMethodError : org. springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation

java - 在运行时获取 JAVA_OPTS