带有嵌入式Tomcat的SpringWebApplicationInitializer(ServletContainerInitializer,@HandleTypes)

带有嵌入式Tomcat的SpringWebApplicationInitializer(ServletContainerInitializer,@HandleTypes),spring,maven,tomcat8,servlet-3.0,spring-web,Spring,Maven,Tomcat8,Servlet 3.0,Spring Web,我不明白为什么在下面这个最小的项目中,当在Eclipse和IntelliJ中运行测试时,却在使用Maven(mvn clean test)时发现了Spring的WebApplicationInitializer接口的实现 使用Eclipse和IntellIJ,我看到信息:在类路径[com.example.pack]上检测到SpringWebApplicationInitializers。DummyInitializer@26d678a4] 通过mvn清理测试我看到INFO:在类路径上未检测到Sp

我不明白为什么在下面这个最小的项目中,当在Eclipse和IntelliJ中运行测试时,却在使用Maven(
mvn clean test
)时发现了Spring的
WebApplicationInitializer
接口的实现

使用Eclipse和IntellIJ,我看到
信息:在类路径[com.example.pack]上检测到SpringWebApplicationInitializers。DummyInitializer@26d678a4]

通过
mvn清理测试
我看到
INFO:在类路径上未检测到Spring WebApplicationInitializer类型

在测试中,我启动了一个嵌入式Tomcat:

String pathToWebXML = new File("src/main/webapp/").getAbsolutePath();
tomcat = new Tomcat();
tomcat.setBaseDir("embedded_tomcat");
tomcat.setPort(0);
tomcat.addWebapp("", pathToWebXML);
tomcat.start();
web.xml
引用了一个
ServletContextListener
实现,该实现创建了一个新的(且为空的)
注释ConfigWebApplicationContext


我将示例项目上传到GitHub:

如注释所示,默认设置中Maven Surefire(和Maven Failsafe)使用的类路径不会被Tomcat扫描。大多数类都是使用JAR文件中的
MANIFEST.MF
文件引用的

一个选项是禁用Maven插件的
useSystemClassLoader
设置。但是,这会更改类加载器的详细信息,这可能会导致其他问题

作为另一个选项,可以禁用
useMistenceOnlyJAR
,这可能会在Windows计算机上造成问题

在我们的项目中,我们决定删除初始值设定项类,而是注册它们应该手动执行的任何操作。在一个具体示例中,由于未找到我们的
AbstractSecurityWebApplicationInitializer
实现,我们现在在
contextInitialized
方法中手动注册安全筛选器:

String filterName = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
servletContext.addFilter(filterName, new DelegatingFilterProxy(filterName)).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");

您可以告诉Tomcat在surefire创建的jar中包含通过清单文件引用的jar。这可以在
context.xml
中将Jar扫描程序属性
scanManifest
设置为true中完成。这是较新版本的Tomcat中的默认值,如下所述:。

您在IntelliJ中使用的java版本是什么。您使用Java8吗?我注意到在pom文件中您使用java8@Periklis是的,我使用Java8。你看到我没有运行Java8的任何提示了吗?我对你的问题感到困惑。抱歉,我只是想确保你在IntelliJ中使用的java版本与你在pom.xml中定义的版本相同。每当我有时间的时候,我都会下载你的应用程序,我会试试看。据我所知,IntellIJ自动导入Maven设置(包括Java版本)。设计决策与Spring Boot相关,我不使用它。然而,提到的Tomcat问题是有见地的。基于您是否看到了使Tomcat查找/扫描/的方法。。。在Maven的情况下正确吗?另一个选项是让Tomcat也包括通过surefire创建的jar中的清单文件引用的jar。这可以通过context.xml将Jar Scanner属性scanmifest设置为true来完成