[英]Separating war application name from war file name
目前,如果我在 tomcat 上部署一個名為myapp.war
的戰爭文件,我可以通過http://localhost/myapp/MyServlet 訪問它的 url 。
但是我想要的是部署一個戰爭文件名中帶有版本號的戰爭,並且仍然具有相同的 url。 例如,我想部署myapp-1.1.0.war
並且仍然讓 url 成為http://localhost/myapp/MyServlet
當然我需要不斷更新戰爭,版本號會不斷變化,所以我不能在任何地方硬編碼戰爭文件名。 web.xml
中是否有任何設置可以用來為應用程序保留相同的 url,而不管戰爭文件名如何?
解決方法是停止使用 Tomcat 的自動部署功能,該功能采用將“上下文名稱”(URL 的/myapp
部分)設置為“.war”之前的 WAR 文件名部分的快捷方式。
相反,自己將 WAR 內容提取到文件系統並在TOMCAT_HOME/conf/[enginename]/[hostname]/[contextname].xml
中設置一個 XML 文件,它將所需的上下文路徑(例如/myapp
)指向磁盤上的應用程序(例如/opt/webapps/myapp-1.1.0/
)。
Tomcat 參考文檔很好地解釋了 Tomcat 如何自動部署應用程序,以及如何配置自定義邏輯以將上下文路徑映射到應用程序文件位置(除了我建議的方法之外,還有一些替代方法可以設置它以上)。
您可以為此使用 YOUR_WAR/META-INF/context.xml。 這是一個示例:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyServlet"/>
使用Maven時,您可以通過執行以下操作來控制部署路徑:
Tomcat的conf/tomcat-users.xml:
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="root" password="root" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
</tomcat-users>
~/.m2/settings.xml:
...
<server>
<id>tomcat</id>
<username>root</username>
<password>root</password>
</server>
...
pom.xml:
...
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myapp</artifactId>
<version>1.1.0</version>
<packaging>war</packaging>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<!-- neglect /html below Tomcat7: -->
<url>http://server:8080/manager/html</url>
<!-- Refer to the server settings in your ~/.m2/settings.xml -->
<server>tomcat</server>
<path>/myWebApp</path>
</configuration>
</plugin>
....
</plugins>
</build>
...
首先啟動您的 tomcat 然后構建和部署您的應用程序..
mvn clean install tomcat:deploy
..它可以在http://server:8080/myWebApp
下訪問
我更喜歡使用“ ## ”符號來標注 tomcat 中 *.war 文件的版本。
例如:
myapp.war
-> URL: http://localhost:8080/myapp/MyServlet
myapp##1.1.0
-> URL: http://localhost:8080/myapp/MyServlet (還是一樣,因為“ ## ”之后的所有符號都被tomcat忽略了)
web.xml 中沒有為此設置。 我不相信有可能以跨容器的方式在war文件中設置它——無論如何在規范中都沒有提到它——所以每個容器的做法都不同。 jboss-web.xml
, sun-web.xml
, context.xml
等。
我遇到了同樣的問題,事實上,正如@matt提到的, Tomcat 參考文檔很好地解釋了 Tomcat 如何自動部署應用程序,以及如何配置自定義邏輯以將上下文路徑映射到應用程序文件位置。
就我而言,我使用了這個建議(在“路徑”解釋中):
即使在 server.xml 中靜態定義 Context 時,也不得設置此屬性 (/path),除非 docBase 不在主機的 appBase 下,或者deployOnStartup 和 autoDeploy 均為 false 。 如果不遵守此規則,很可能導致雙重部署。
所以在我的情況下,我將deployOnStartup
和autoDeploy
都切換為 false,所以我的 WAR(egaWAR)沒有自動展開到 webapps 下的“a”目錄,而是因為這些設置而進入“b”目錄:
<Host name="localhost" appBase="webapps"
autoDeploy="false" deployOnStartup="false"
unpackWARs="true" deployIgnore="${ignore.context}">
<Context docBase="a" path="/b" />
</Host>
我發現關於這個主題的所有建議都有些簡潔和混亂。 以下方法適用於我使用默認的 tomcatee 安裝。
假設我有一個名為 mywar.war 的戰爭文件。 這包含一個到“/hello”的 servlet 映射。 我想從像 localhost:8080/myapp/hello 這樣的 url 訪問這個 servlet
此方法可避免對 server.xml 進行任何更改,不建議這樣做,因為這需要重新啟動 tomcat。
如果您部署到 /webapps,此方法將失敗,因為它將嘗試部署相同的戰爭兩次。 因此,我首先創建一個要部署到的新目錄。 我使用 /apps 但目錄名稱是任意的。
我現在將 mywar.war 復制到應用程序中。 Tomcat 忽略此操作。 我現在創建一個名為 myapp.xml 的簡單部署文件。 請注意,此文件的名稱定義了將部署戰爭的 URL 上下文。 相信你可以使用ROOT.xml來部署下。 內容如下:
如上所述,這需要復制到 /conf/Catalina/localhost 這會導致 tomcat 擴展和部署 /apps/mywar.war 並設置正確的 URL 上下文。 servlet 現在可以在 localhost://myapp/hello (或遠程客戶端:8080//myapp/hello)上使用。
請注意,對於相對地址,docBase URL 從 webapps 目錄中識別戰爭的位置 - 因此前導..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.