簡體   English   中英

將戰爭應用程序名稱與戰爭文件名分開

[英]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.xmlsun-web.xmlcontext.xml等。

我遇到了同樣的問題,事實上,正如@matt提到的, Tomcat 參考文檔很好地解釋了 Tomcat 如何自動部署應用程序,以及如何配置自定義邏輯以將上下文路徑映射到應用程序文件位置。

就我而言,我使用了這個建議(在“路徑”解釋中):

即使在 server.xml 中靜態定義 Context 時,也不得設置此屬性 (/path),除非 docBase 不在主機的 appBase 下,或者deployOnStartup 和 autoDeploy 均為 false 如果不遵守此規則,很可能導致雙重部署。

所以在我的情況下,我將deployOnStartupautoDeploy都切換為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM