Java Can';在Maven Surefire下运行测试时找不到JSTL标记库

Java Can';在Maven Surefire下运行测试时找不到JSTL标记库,java,jsp,maven,jetty,surefire,Java,Jsp,Maven,Jetty,Surefire,我有一个基于Servlet的应用程序(OAuth实现),它将一些响应呈现委托给JSP,如下例所示: private void doLoginPage( AuthorizationSession authzSession, String errorMsg, HttpServletRequest request, HttpServletResponse response ) throws OAuthSystemException { try { response.setHea

我有一个基于Servlet的应用程序(OAuth实现),它将一些响应呈现委托给JSP,如下例所示:

private void doLoginPage( AuthorizationSession authzSession, String errorMsg, HttpServletRequest request, HttpServletResponse response ) throws OAuthSystemException {
    try {
        response.setHeader( HTTP.CONTENT_TYPE, ContentType.create( "text/html", "utf-8" ).toString() );
        request.getRequestDispatcher( "/WEB-INF/OAuthLogin.jsp" ).include( request, response );
    } catch ( Throwable e ) {
        throw new OAuthSystemException( "Error generating login page", e );
    }
}
以下是JSP文件(简化):

当我从IDE(IntelliJ)运行单元测试时,这可以正常工作,但当我在Maven的Surefire下运行单元测试时,此特定测试失败:服务器线程抛出异常,如下所示:

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
      <useManifestOnlyJar>false</useManifestOnlyJar>
    </configuration>
  </plugin>
  ....
<plugin>
这当然会导致测试的客户端失败,因为它会返回错误响应,而不是预期的登录页面


那么,这两个测试环境之间有什么不同,我如何才能让这两个测试都能工作呢?

事实证明,默认情况下,Maven的Surefire插件采用了一种技巧,它创建了一个只包含清单的JAR文件,以避免将完整的类路径传递给分叉的JRE(请参阅)。Jetty JSP处理器只要求每个类加载器提供其URL列表,因此只看到一个仅清单的JAR文件,而不是实际使用的所有JAR文件,因此找不到TLD文件

简单的解决方案(也记录在该页面上)是关闭
useMistentOnlyJAR
选项,如下所示:

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
      <useManifestOnlyJar>false</useManifestOnlyJar>
    </configuration>
  </plugin>
  ....
<plugin>

org.apache.maven.plugins
maven surefire插件
2.18.1
假的
....

这指示Surefire直接将完整的类路径传递给分叉的JRE进程,从而允许它定位TLD。

这为我在Maven测试期间使用带JSP的Spring Boot嵌入式Tomcat提供了窍门