使用tomcat7-maven-plugin且Initializer在war依赖中时无法找到Spring WebApplicationInitializer
解决Spring MVC War依赖中WebApplicationInitializer无法被识别的问题
这个问题我之前也碰到过,核心原因是Maven处理war依赖的默认行为导致的——当你把app1作为war包引入时,Maven只会提取war里WEB-INF/lib下的jar包到app2的类路径,而app1自己的编译类(包括你的WebApplicationInitializer)在WEB-INF/classes目录下,这部分不会被自动包含进去,所以Tomcat启动时扫描不到这些类。
下面给你几个可行的解决方案:
方案一:拆分app1为Jar+War模块(推荐)
这是最规范的做法,把业务逻辑和配置类与war打包分离:
- 新建一个
app1-core模块,类型为jar,将app1中src/main/java下的所有代码(包括WebApplicationInitializer、控制器、配置类等)迁移到这个模块中。 - 修改原app1的war模块,添加对
app1-core的依赖:<dependency> <groupId>com.mycompany</groupId> <artifactId>app1-core</artifactId> <version>${project.version}</version> </dependency> - 在app2的pom.xml中,把原来的war依赖换成
app1-core的jar依赖:<dependency> <groupId>com.mycompany</groupId> <artifactId>app1-core</artifactId> <version>${project.version}</version> </dependency>
这样app1的核心类会直接进入app2的类路径,Spring就能正常扫描到WebApplicationInitializer了。
方案二:通过Maven插件解压War包提取Classes
如果不想拆分模块,可以用maven-dependency-plugin把app1 war包中的WEB-INF/classes解压到app2的类路径中:
在app2的pom.xml中添加以下插件配置:
<build> <plugins> <!-- 解压app1的war包,提取WEB-INF/classes到app2的编译目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack-app1-war</id> <phase>process-classes</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>com.mycompany</groupId> <artifactId>app1</artifactId> <type>war</type> <overWrite>false</overWrite> <outputDirectory>${project.build.directory}/classes</outputDirectory> <includes>WEB-INF/classes/**/*</includes> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> <!-- 配置tomcat7-maven-plugin使用正确的类路径 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <classesDirectory>${project.build.directory}/classes</classesDirectory> </configuration> </plugin> </plugins> </build>
执行mvn tomcat7:run时,插件会先把app1的classes解压到app2的编译目录,这样Tomcat就能扫描到app1的WebApplicationInitializer了。
方案三:确认组件扫描范围(辅助检查)
不管用上面哪种方案,最后都要确保app2的Spring配置包含了app1的包路径:
比如在app2的WebApplicationInitializer或者@Configuration类中,添加:
@ComponentScan(basePackages = {"com.mycompany.app1", "com.mycompany.app2"})
这样Spring会主动扫描指定包下的所有组件,包括WebApplicationInitializer。
内容的提问来源于stack exchange,提问作者Robert Bowen
相关产品推荐
相关产品推荐

