我的webapp文件夹中有3场战争。其中两个建立在第三个服务的基础上。我在测试环境中,即我无法控制他们的架构,所以我无法改变一件事。所以......
问题:有没有办法在tomcat中强制部署订单?
我在stackoverflow中遇到了一个问题here,但是没有解决方案。
嗯,实际上这个人建议将webapps的名称更改为按字母顺序排列会有所帮助。但是,每次我需要测试那些不同的战争时,我都不愿意这样做。
我很肯定有一种方法可以配置一个tomcat conf .xml文件。我只是不知道哪一个。
答案 0 :(得分:16)
来自Tomcat Wiki - What order do webapps start (or How can I change startup order)?
没有预期的启动订单。既不是Servlet规范也不是 Tomcat定义一个。你不能依赖从任何开始的应用程序 特别的顺序。
Tomcat 从不支持指定webapps的加载顺序。还有其他容器,如JBoss,但Tomcat从未有过。通过Web应用程序名称的字母顺序看起来像加载顺序的任何明显行为都是巧合,并不能保证在所有情况下都能正常工作。
如果<load-on-startup/>
指定了加载顺序web.xml
,那么您可能会想到的是servlets
元素。
那就是使用服务发现协议的优雅解决方案。
一种解决方案是使用类似ZeroConf之类的内容,并在启动时注册您的服务,然后让相关应用在这些服务可用时查找并让它们连接并执行他们需要做的事情。服务准备就绪。这就是我多年来一直处理多个依赖服务的方式。我有Python,Java和Erlang服务都通过ZeroConf无缝地发现彼此。
答案 1 :(得分:7)
Tomcat确实没有提供任何强制部署顺序的方法。
* Tomcat按以下顺序部署webapp: *
1.首先会部署任何上下文描述符。
2.将部署未被任何上下文描述符引用的爆炸Web应用程序。如果他们在appBase中有一个关联的.WAR文件,并且它比爆炸的Web应用程序更新,则会删除展开的目录,并从.WAR重新部署webapp
将部署3.WAR文件
<强>&GT;这是一个建议的解决方案:
如果要指定部署顺序,请在$ CATALINA_BASE / conf / [enginename] / [hostname] /MyApp.xml
中为Web应用程序定义上下文Tomcat通过执行File listFiles()来扫描$ CATALINA_BASE / conf / [enginename] / [hostname] /,它返回按哈希值排序的File数组(取决于操作系统)。
您可以使用以下代码检查将部署Webapps的顺序
File file = new File("/opt/tomcat/conf/Catalina/localhost");
File[] files = file.listFiles();
for (File f : files)
{
System.out.println("Filename: " + f.getName());
}
答案 2 :(得分:3)
在Tomcat中部署webapp.war
有三种方法。
在Context
文件的Host
元素中添加$CATALINA_BASE/conf/server.xml
元素。
<Server><Service><Engine><Host>
<Context path="[webappName]" docBase="[webappPath]"/>
</Server></Service></Engine></Host>
创建包含内容的$CATALINA_BASE/conf/[engineName]/[hostName]/[webappName].xml
文件:
<Context docBase="[webappPath]"/>
直接在webapp.war
目录中添加$CATALINA_BASE/webapps/
文件。
Tomcat启动时将发生以下部署顺序:
<强> 1→2→3 强>
一些解释:
$ CATALINA_BASE
请参阅解析大多数相对路径的基目录。如果尚未通过设置CATALINA_BASE目录为多个实例配置Tomcat,则$ CATALINA_BASE将设置为$ CATALINA_HOME的值,即您安装Tomcat的目录。
的docBase
Web应用程序WAR文件的路径名。您可以为此WAR文件指定绝对路径名,或者指定相对于拥有主机的appBase目录的路径名。
engineName:
与上下文关联的引擎名称。默认名称为Catalina
。
主机名:
与上下文关联的主机的名称。默认名称为localhost
。
假设:
a.war
,b.war
和c.war
。b.war
取决于a.war
。c.war
取决于b.war
。请尝试以下步骤:
$CATALINA_BASE/webapps/
目录。创建包含内容的$CATALINA_BASE/conf/Catalina/localhost/b.xml
文件:
<Context docBase="b.war"/>
在Context
文件中添加$CATALINA_BASE/conf/server.xml
元素:
<Server><Service><Engine><Host>
<Context path="a" docBase="a.war"/>
</Server></Service></Engine></Host>
参考:
答案 3 :(得分:1)
交叉发布道歉(Tomcat - starting webapps in a specific order),但我认为这也很重要:
您可以在server.xml中定义多个服务,这些服务在不同的端口上运行。服务按照它们在server.xml中出现的顺序依次启动。这意味着您可以 - 例如 - 在第一个服务中运行配置服务,然后在第二个服务中运行依赖它的应用程序(我使用其余的默认Catalina ...)
您可以在此处查看更多信息: http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27
这是我在 Catalina服务之前包含的服务:
<Service name="ConfigService">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8444" />
<Engine name="ConfigServiceEngine" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" reloadable="true" docBase="/path/to/your/service/directory" />
</Host>
</Engine>
</Service>
正如您所看到的,我使用docbase而不是appBase,但如果您愿意,您应该能够配置不同的appBase ...
注意更改服务和引擎的名称非常重要。
HTH
答案 4 :(得分:0)
您始终可以将第一个.war文件移动到tomcat目录中,然后等待它部署,然后将下两个文件移动到tomcat目录中。这将部署第一个,然后部署另外两个。
或者您可以使用Tomcat将扫描目录并部署第一次战争,然后是第二次战争,然后按字母顺序排列第三次战争的事实
答案 5 :(得分:0)
如果您不关心破解一些tomcat代码并创建自己的Host实例,那么这很容易实现
1)创建一个org.apache.catalina.core.StandardHost的子类,比如说MyHost:
class MyHost extends org.apache.catalina.core.StandardHost{
public MyHost (){
super();
//changing HashMap for a predictable ordered Map :)
this.children = new LinkedHashMap();
}
}
2)在服务器的xml主机标签()
上注册您的课程看起来难以置信,只要您在Host标记内以正确的顺序声明所有Web应用程序,它就可以解决问题:
<Host>
<context app1>
<context app2>
Thaen app1将在app2之前启动,无论你使用哪个。
答案 6 :(得分:0)
我们运行多个tomcats。我们可以通过将第一组放在一个tomcat中而将后一组放在一个tomcat中来独立地启动应用程序组。
这假设他们没有尝试使用JVM相互通信。