如何在Tomcat服务器上部署应用程序

6

我希望能在Tomcat服务器上部署我的应用程序。我知道一种方法是从webapps中删除Root文件夹,将我的app.war重命名为ROOT.WAR。但我不想这样做。我希望像用户访问www.xxx.com一样部署我的应用程序,就像www.xxx.com/login.html。


3个回答

17
您可以部署任何WAR文件(或已解压的WAR目录),并使用您想要的任何上下文名称,只要它不与任何自动部署的应用程序冲突。以下是如何操作:
  1. webapps/中删除任何冲突的应用程序(在这种情况下,实际上只有ROOT)。
  2. 将您自己的应用程序移至除webapps/之外的其他位置。
  3. 将您的应用程序的META-INF/context.xml文件复制到Tomcat的conf/[engine]/[host]/[contextpath].xml中,例如:conf/Catalina/localhost/ROOT.xml
  4. 编辑conf/[engine]/[host]/[contextpath].xml并向<Context>元素添加此属性:

    docBase="/path/to/your/WAR.war"

现在,Tomcat将在上下文路径/上部署/path/to/your/WAR.war(因为部署描述符的文件名为ROOT),而且您不需要修改conf/server.xml
谁关心修改conf/server.xml?好吧,那个文件只在容器启动期间读取一次,因此如果要进行更改、撤消部署、重新部署等操作,则必须重新启动整个容器才能捕获这些更改。最好使用Tomcat的自动部署功能,正如您所看到的那样是非常灵活的。
所有这些都在Tomcat关于定义上下文的文档中详细阐述,其中,第一句话清楚地表明,在server.xml中定义上下文是不良实践。

我知道这是一个旧答案,但即使这样做,我的应用程序部署在localhost:port/myapp而不是localhost:port/。这是在Tomcat 9.0.20上。我正在从webapps中删除ROOT,将myapp.war复制到tomcat/app(这是一个自定义位置),将myapp.xml复制到/usr/local/tomcat/conf/Catalina/localhost/,其中包含<Context docBase="/usr/local/tomcat/app/myapp.war"></Context>。你能帮我找出我做错了什么吗? - Sajib Acharya
2
@SajibAcharya 你需要将你的XML文件命名为ROOT.xml而不是myapp.xml。Tomcat从XML文件的名称中派生上下文路径,并且使用名称ROOT.xml作为特殊处理,将零长度字符串用作上下文路径。 - Christopher Schultz
我尝试了这个方法,完成步骤并部署我的war文件后,在Tomcat的Web应用程序管理器列表页面下出现了两个新应用程序,一个命名为原始名称"myapp",另一个是"/"代表根目录。然而,根目录应用程序没有启动,也无法工作。 "myapp" 应用程序像往常一样工作。我尝试在ROOT.xml中调整路径,但没有成功。此外,卸载会删除ROOT.xml文件。我将尝试阅读Tomcat页面,但可能需要回到每次重命名为ROOT.war的方式,这似乎很奇怪,但效果很好。 - Michael K
如果您将WAR文件放入Tomcat的自动部署“webapps”目录中,则如果使用此答案中详细说明的方法,它将被部署两次。请注意,在步骤2中,它说将您自己的应用程序移动到除了webapps/之外的其他地方 - Christopher Schultz
@ChristopherSchultz,您能详细说明为什么您提出的解决方案比将ROOT.war放置在“webapps”文件夹中更好吗?使用ROOT.war要简单得多,因此了解为什么我们应该更喜欢上述更复杂的解决方案将非常有帮助。 - Jacek J

2
您有几个选项来设置根应用程序。(参见https://dev59.com/uG435IYBdhLWcg3wlRIf#5328636
  1. 删除ROOT目录并将您的war文件部署为ROOT.war

  2. webapps中部署您的war文件,并在conf/server.xml中配置上下文根以使用您的war文件(不建议使用,因为需要重新启动)

  3. 创建一个特定的上下文文件$CATALINA_BASE/conf/[enginename]/[hostname]/ROOT.xml,并像前面的2)一样设置docBase=your_war_name(请参见@ChristopherShultz的答案)

由于您已放弃选项1,而选项2不建议使用,我建议使用上下文文件。


1
server.xml中配置Context是一个不好的想法。 - Christopher Schultz
为什么是@ChristopherSchultz?我同意,但是如果OP不想将WAR重命名为ROOT,那么选择并不多。如果您认为此选项不可行,我认为您应该包括您自己的答案,并提供链接中的其他选项,而不是将其标记为重复。 6个点赞答案中有5个提供了相同的技术,只有一个负面评论。 - pedrofb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接