【Tomcat学习】如何调整多个项目的顺序

在集成项目中,遇到因System.setProperty导致的数据污染问题。通过调整Tomcat中webapp的加载顺序,确保第三方应用在公司系统前启动,解决了Class无法加载的问题。

背景

最近在做一个系统的集成的时候碰到Webapp下只放集成项目启动就没问题,然而把集成项目放到公司产品的Tomcat的webapp下就报Class无法加载等问题.

后面跟踪发现是由于【公司系统】大量使用System.setProperty将本应该是【公司系统】webapp的数据写到了全局中了,巧合的是【第三方应用】启动的时候又在【公司系统】webapp之后,所以问题就出现了。

解决办法

由于两个webapp启动并没有要求谁先加载,谁后加载,那么通过修改webapp加载顺序来确保【第三方应用】在【公司系统】之前启动

在tomcat/config/localhost/目录下添加文件,文件名=webapp名称,文件内容如下

<Context path="/sreport" docBase="sreport" reloadable="false"></Context>

总结

由于webapp名称不可修改,如果名称可以修改的话,可以考虑将名称改下使其排到前面去,此方法也是无奈之举。

参考链接

  1. tomcat 多项目启动顺序问题
### Tomcat多个 WAR 包的加载顺序 在 Apache Tomcat 中,默认情况下,WAR 文件按照放置于 `webapps` 目录下的时间顺序进行部署。当启动服务器时,Tomcat 会扫描该目录并尝试解压这些文件来创建 Web 应用程序上下文[^1]。 对于希望控制特定应用优先级的情况,可以通过配置 `server.xml` 文件内的 `<Host>` 元素下定义的应用程序标签 `<Context>` 来指定路径和加载属性。具体来说: - **docBase**: 定义应用程序的基础文档位置,即实际存放 `.war` 或者展开后的项目根目录的位置。 - **path**: 设置 URL 访问此应用时使用的虚拟路径;通常留空表示默认应用(例如访问 http://localhost:8080/ 即可到达)。 - **loadOnStartup**: 这是一个整数值参数,用于指示容器应该何时初始化这个 Servlet 上下文。负数意味着永远不会自动装载,零代表随主机一起启动,正数则指定了相对次序——越小越早被处理[^5]。 下面给出一段简单的 XML 配置片段作为例子说明如何调整两个不同应用 A 和 B 的加载先后关系: ```xml <Host name="localhost" appBase="webapps"> <!-- Application A will be loaded before others --> <Context docBase="/opt/tomcat/webapps/app-A.war" path="" loadOnStartup="1"/> <!-- Application B has a higher value so it loads after App A --> <Context docBase="/opt/tomcat/webapps/app-B.war" path="/appB" loadOnStartup="2"/> </Host> ``` 值得注意的是,在某些版本中直接编辑 `server.xml` 可能不是最佳实践,因为这可能会随着更新而丢失更改。建议考虑使用独立的 `context.xml` 文件放在相应应用的 META-INF 文件夹内来进行个性化设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值