【问题标题】:Spring WebApplicationInitializer (ServletContainerInitializer, @HandlesTypes) with Embedded Tomcat带有嵌入式 Tomcat 的 Spring WebApplicationInitializer (ServletContainerInitializer, @HandlesTypes)
【发布时间】:2017-01-16 15:10:37
【问题描述】:

我不明白为什么在以下最小项目中我在 Eclipse 和 IntelliJ 中运行测试时发现了 Spring 的 WebApplicationInitializer 接口的实现,但在使用 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

【问题讨论】:

  • 您在 IntelliJ 中使用的是什么版本的 java。你使用 java 8 吗?我注意到在 pom 文件中你使用 java 8
  • @Periklis 是的,我使用 Java 8。您是否看到任何提示我不运行 Java 8?我对你的问题感到困惑。
  • 对不起,我只是想确保您在 IntelliJ 中使用的 java 版本与您在 pom.xml 中定义的版本相同。任何时候,我都会下载你的应用程序,我会试一试
  • 好的。据我所知,IntellIJ 会自动导入 Maven 设置(包括 Java 版本)。
  • 设计决策与Spring Boot有关,我不使用。但是,引用的 Tomcat 问题很有见地。基于bz.apache.org/bugzilla/show_bug.cgi?id=52853#c19,您是否看到在 Maven 案例中让 Tomcat 正确查找/扫描/...的方法?

标签: spring maven tomcat8 servlet-3.0 spring-web


【解决方案1】:

如 cmets 所示,Maven Surefire(和 Maven Failsafe)在默认设置中使用的类路径不会被 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, "/*");

【讨论】:

  • 另一种选择是让 Tomcat 也包含通过清单文件引用的 jars,这些 jars 是由 surefire 创建的 jar 文件。这可以在 context.xml 中完成,将 Jar Scanner 属性 scanManifest 设置为 true
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2017-09-14
    • 2017-10-21
    • 2018-08-08
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多