两个Web应用能否共享同一Java项目中的Servlet代码
方案可行性结论
该方案完全可行,不需要在fr、en两个Web项目中重复编写相同的Servlet代码。
实现原理
web.xml中<servlet-class>配置项的作用,是告知Servlet容器(Tomcat/Jetty等)当前Web应用启动时,需要加载对应全限定名的类来实例化Servlet,规则只要求这个类存在于当前Web应用的类加载路径中,并不强制要求类的源码必须写在当前Web项目自身的目录下。
你给出的配置写法本身是正确的:
<servlet> <description></description> <display-name>AServlet</display-name> <servlet-name>AServlet</servlet-name> <servlet-class>com.projp.AServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/a_servlet</url-pattern> </servlet-mapping>
必要前置条件
要让配置正常生效,只需要保证Java项目P的编译输出能被fr、en两个Web应用的类加载器扫描到即可,常规操作有两种:
- 把项目P打包为jar包,分别放到fr、en两个Web应用的
WEB-INF/lib目录下 - 如果使用Maven/Gradle等构建工具,直接将项目P声明为fr、en两个项目的编译依赖,构建时工具会自动将P的产物拷贝到对应Web应用的依赖目录
注意事项
虽然fr、en两个应用引用的是同一个Servlet类,但二者的运行态是完全隔离的:
- 两个独立Web应用持有各自独立的类加载器、独立的Servlet上下文
- 两个应用中初始化生成的AServlet实例互不干扰,各自的初始化参数、请求处理、成员变量数据完全隔离,不会出现跨应用的数据串扰问题
内容的提问来源于stack exchange,提问作者Léa Massiot
相关产品推荐
相关产品推荐

