2016-05-06 117 views
2

我无法理解为什么在以下最小项目中,我在Eclipse和IntelliJ中运行测试时发现了接口的弹簧WebApplicationInitializer,但在使用Maven(mvn clean test)时未找到接口。使用嵌入式Tomcat的Spring WebApplicationInitializer(ServletContainerInitializer,@HandlesTypes)

使用Eclipse和IntelliJ我看到INFO: Spring WebApplicationInitializers detected on classpath: [[email protected]]

随着mvn clean test我看到INFO: No Spring WebApplicationInitializer types detected on classpath

在测试中我开始一个嵌入式的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实现它创建了一个新的(空)AnnotationConfigWebApplicationContext

我上传的示例项目的GitHub:https://github.com/C-Otto/webapplicationinitializer

+0

您在IntelliJ中使用的是什么版本的java。你使用java 8吗?我注意到在你使用java 8 –

+0

@Periklis的pom文件中,我使用Java 8.你有没有看到我不运行Java 8的提示?我对你的问题感到困惑。 –

+0

对不起,我只是想确保你在IntelliJ中使用的Java版本是你在pom.xml中定义的版本。每当我有时间我会下载你的应用程序,我会试一试 –

回答

0

作为评价所示,在默认设置使用的Maven神火(和Maven故障安全)的路径并不通过Tomcat的扫描。大多数类都使用JAR文件中的MANIFEST.MF文件进行引用。

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

作为另一种选择,可以禁用useManifestOnlyJar,这可能会在Windows计算机上导致问题。

在我们的项目中,我们决定删除初始化类,而是注册他们应该手动执行的任何操作。在一个具体的例子,因为我们的AbstractSecurityWebApplicationInitializer执行没有被发现,我们现在手动注册安全过滤器contextInitialized方法中:

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

另一个选择是让Tomcat也包含通过surefire创建的jar中的清单文件引用的jar。这可以在context.xml中将Jar Scanner属性scanManifest设置为true来完成 – user1304680

相关问题