私のアプリケーション コンテキストは、 にある 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 を tail しても何もわからないことです。さらに、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) これを理解するために一日中グーグルで検索しましたが、この特定の構成で役立つものは何も見つかりませんでした。
選択肢は次のようです:
- autoDeploy がオンになっている Tomcat (本番環境では推奨されません) の場合、新しい WAR をドロップするだけで、
/my/path/to/myApp/
Tomcat はアプリをホット デプロイします。 - Tomcat では autoDeploy がオフになっていますが、デプロイ API が宣伝どおりに動作していないため、再デプロイするには Tomcat を再起動する必要があります。
この構成でこれを動作させた人はいますか?
編集:
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) はコンテキストを削除せずに再デプロイする必要があります。
この問題は、コンテキストを削除せずに戦争から再展開するどうやら、これはテキスト インターフェイスですでに可能であると想定されているため、これが不可能な場合はバグと見なすことができます。
推奨される解決策は、この serverfault 問題が Tomcat の問題の重複となるため、解決されるまでこの Tomcat の問題を監視することです。