2

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

使用 Eclipse 和 IntellIJ 我看到了INFO: Spring WebApplicationInitializers detected on classpath: [com.example.pack.DummyInitializer@26d678a4]

随着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

4

2 回答 2

0

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

一种选择是禁用useSystemClassLoaderMaven 插件的设置。但是,这会更改类加载器的细节,这可能会导致其他问题。

作为另一种选择,可以禁用useManifestOnlyJar,这可能会导致 Windows 机器出现问题。

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

String filterName = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
servletContext.addFilter(filterName, new DelegatingFilterProxy(filterName)).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
于 2016-05-24T08:45:36.773 回答
0

您可以告诉 Tomcat 将通过清单文件引用的 jar 包含在由 surefire 创建的 jar 中。这可以通过context.xml将 Jar Scanner 属性设置scanManifest为 true 来完成。这是较新版本的 Tomcat 中的默认设置,如下所述:https ://bz.apache.org/bugzilla/show_bug.cgi?id=59961 。

于 2017-01-16T07:10:37.603 回答