Kann JSTL-Tag-Bibliothek nicht finden, wenn Test unter Maven Surefire ausgeführt wird

Ich habe eine Servlet-basierte Anwendung (OAuth-Implementierung), die einen Teil des Antwort-Renderings an JSP delegiert, wie im folgenden Beispiel dargestellt:

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 );
    }
}

Hier ist die JSP-Datei (vereinfacht):

<%@ page contentType="text/html;charset=UTF-8" language="java" session="false" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<jsp:useBean id="errorMsg" scope="request" class="java.lang.String"/>

<html>
<head>
<title>Sign In</title>
</head>
<body style="text-align: center;">
<h1>Sign In</h1>
<div style="border: 1px black;">
    <c:if test="${!(empty errorMsg)}">
        <p style="color:red;">${errorMsg}</p>
    </c:if>
    <form method="post" action="<c:url value="/authorize"/>">
        <div><label for="email">Email:</label></div>
        <div><input type="text" name="email" id="email"/></div>
        <div><label for="password">Password:</label></div>
        <div><input type="password" name="password" id="password"/></div>
        <div><input type="submit" title="Sign In" /></div>
    </form>
</div>
</body>
</html>

Ich habe meine Unit-Tests so eingerichtet, dass ich serverbasierte Tests als Unit-Tests mit injizierten Mocks unter Verwendung von Jetty als In-Process-Server ausführen kann (OK, es handelt sich also nicht um reine Unit-Tests).

Als Teil meines Unit-Tests habe ich einen Test geschrieben, um sicherzustellen, dass die Seite bei Bedarf gerendert wird und bestimmte Schlüsseleigenschaften enthält (ich verwende TestNG und Hamcrest):

@Test
public void testRequestGrantYieldsLoginPage() throws Exception {
    HttpGet request = new HttpGet( String.format( "%s/authorize?client_id=%s&redirect_uri=%s&response_type=token",
            serverConnector.getServerURL(),
            "*******secret*****",
            URLEncoder.encode( "*****secret*********", "UTF-8" )));

    DefaultHttpClient httpClient = new SystemDefaultHttpClient();
    HttpResponse response = httpClient.execute( request );

    assertThat( response, is( notNullValue() ));
    assertThat( response.getStatusLine().getStatusCode(), is( 200 ));
    assertThat( response.getEntity().getContentType().toString(), containsString( "text/html" ));

    String body = IOUtils.toString( response.getEntity().getContent() );

    assertThat( body, allOf(
            is( notNullValue()),
            containsString( "value=\"gQwCAShitcuP-_2OY58lgw3YW0AfbLE8m62mrvXWvQbiDLJk9QnDTs7pc0HH\"" )
    ));
}

Dies funktioniert einwandfrei, wenn ich meine Komponententests über meine IDE (IntelliJ) ausführe, aber wenn ich sie unter Mavens Surefire ausführe, schlägt dieser spezielle Test fehl: Der Server-Thread löst die folgende Ausnahme aus:

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

Dies führt natürlich dazu, dass die Client-Seite des Tests fehlschlägt, da anstelle der erwarteten Anmeldeseite eine Fehlerantwort zurückgegeben wird.

Was unterscheidet sich zwischen den beiden Testumgebungen und wie kann ich diesen Test in beiden Umgebungen zum Laufen bringen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage