Updated Jetty version used in JUnit tests, because the old one can't run on Java 16. Also some adjustments in Jetty setup was needed.
diff --git a/ivy.xml b/ivy.xml
index 8a5afea..b379f16 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -21,7 +21,7 @@
   AFTER CHANGING THIS FILE don't forget to issue: ant update-deps
 -->
 <!DOCTYPE ivy-module [
-    <!ENTITY jetty.version "7.6.21.v20160908">
+    <!ENTITY jetty.version "9.4.53.v20231009">
     <!ENTITY slf4j.version "1.6.1">
     <!ENTITY spring.version "2.5.6.SEC03">
 ]>
@@ -143,9 +143,12 @@
 
     <dependency org="org.eclipse.jetty" name="jetty-server" rev="&jetty.version;" conf="test->default" />
     <dependency org="org.eclipse.jetty" name="jetty-webapp" rev="&jetty.version;" conf="test->default" />
-    <dependency org="org.eclipse.jetty" name="jetty-jsp" rev="&jetty.version;" conf="test->default" />
     <dependency org="org.eclipse.jetty" name="jetty-util" rev="&jetty.version;" conf="test->default" />
-    
+    <dependency org="org.eclipse.jetty" name="apache-jsp" rev="&jetty.version;" conf="test->default" />
+    <!-- JPS JSTL: -->
+    <dependency org="org.apache.taglibs" name="taglibs-standard-impl" rev="1.2.5" conf="test->default" />
+    <dependency org="org.apache.taglibs" name="taglibs-standard-spec" rev="1.2.5" conf="test->default" />
+
     <dependency org="displaytag" name="displaytag" rev="1.2" conf="test->default">
       <exclude org="com.lowagie" name="itext" />
       <exclude org="org.slf4j" name="slf4j-log4j12" />
diff --git a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java b/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
index ad0c7b6..8c3982e 100644
--- a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
+++ b/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
@@ -207,15 +207,13 @@
     public void tldDiscoveryRelative() throws Exception {
         assertExpectedEqualsOutput(WEBAPP_TLD_DISCOVERY, "subdir/test-rel.txt", "tester?view=subdir/test-rel.ftl");
     }
-    
+
     @Test
     public void errorStatusCodes() throws Exception {
         assertEquals(404, getResponseStatusCode(WEBAPP_ERRORS, "missing.jsp"));
         assertEquals(500, getResponseStatusCode(WEBAPP_ERRORS, "failing-runtime.jsp"));
         assertEquals(500, getResponseStatusCode(WEBAPP_ERRORS, "failing-parsetime.jsp"));
         
-        assertEquals(200, getResponseStatusCode(WEBAPP_ERRORS,
-                "tester?view=not-failing.ftl&viewServlet=freemarker-default-dev"));
         assertEquals(404, getResponseStatusCode(WEBAPP_ERRORS,
                 "tester?view=missing.ftl&viewServlet=freemarker-default-dev"));
         assertEquals(200, getResponseStatusCode(WEBAPP_ERRORS,
diff --git a/src/test/java/freemarker/template/MockServletContext.java b/src/test/java/freemarker/template/MockServletContext.java
index f833bec..0ed47ec 100644
--- a/src/test/java/freemarker/template/MockServletContext.java
+++ b/src/test/java/freemarker/template/MockServletContext.java
@@ -22,12 +22,20 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.descriptor.JspConfigDescriptor;
 
 public class MockServletContext implements ServletContext {
 
@@ -55,6 +63,11 @@
         return null;
     }
 
+    @Override
+    public boolean setInitParameter(String s, String s1) {
+        return false;
+    }
+
     public int getMajorVersion() {
         return 0;
     }
@@ -67,6 +80,16 @@
         return 0;
     }
 
+    @Override
+    public int getEffectiveMajorVersion() {
+        return 0;
+    }
+
+    @Override
+    public int getEffectiveMinorVersion() {
+        return 0;
+    }
+
     public RequestDispatcher getNamedDispatcher(String arg0) {
         return null;
     }
@@ -103,6 +126,126 @@
         return "MyApp";
     }
 
+    @Override
+    public ServletRegistration.Dynamic addServlet(String s, String s1) {
+        return null;
+    }
+
+    @Override
+    public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) {
+        return null;
+    }
+
+    @Override
+    public ServletRegistration.Dynamic addServlet(String s, Class<? extends Servlet> aClass) {
+        return null;
+    }
+
+    @Override
+    public <T extends Servlet> T createServlet(Class<T> aClass) throws ServletException {
+        return null;
+    }
+
+    @Override
+    public ServletRegistration getServletRegistration(String s) {
+        return null;
+    }
+
+    @Override
+    public Map<String, ? extends ServletRegistration> getServletRegistrations() {
+        return null;
+    }
+
+    @Override
+    public FilterRegistration.Dynamic addFilter(String s, String s1) {
+        return null;
+    }
+
+    @Override
+    public FilterRegistration.Dynamic addFilter(String s, Filter filter) {
+        return null;
+    }
+
+    @Override
+    public FilterRegistration.Dynamic addFilter(String s, Class<? extends Filter> aClass) {
+        return null;
+    }
+
+    @Override
+    public <T extends Filter> T createFilter(Class<T> aClass) throws ServletException {
+        return null;
+    }
+
+    @Override
+    public FilterRegistration getFilterRegistration(String s) {
+        return null;
+    }
+
+    @Override
+    public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
+        return null;
+    }
+
+    @Override
+    public SessionCookieConfig getSessionCookieConfig() {
+        return null;
+    }
+
+    @Override
+    public void setSessionTrackingModes(Set<SessionTrackingMode> set) {
+
+    }
+
+    @Override
+    public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
+        return null;
+    }
+
+    @Override
+    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
+        return null;
+    }
+
+    @Override
+    public void addListener(String s) {
+
+    }
+
+    @Override
+    public <T extends EventListener> void addListener(T t) {
+
+    }
+
+    @Override
+    public void addListener(Class<? extends EventListener> aClass) {
+
+    }
+
+    @Override
+    public <T extends EventListener> T createListener(Class<T> aClass) throws ServletException {
+        return null;
+    }
+
+    @Override
+    public JspConfigDescriptor getJspConfigDescriptor() {
+        return null;
+    }
+
+    @Override
+    public ClassLoader getClassLoader() {
+        return null;
+    }
+
+    @Override
+    public void declareRoles(String... strings) {
+
+    }
+
+    @Override
+    public String getVirtualServerName() {
+        return null;
+    }
+
     public Enumeration getServletNames() {
         return null;
     }
diff --git a/src/test/java/freemarker/test/servlet/WebAppTestCase.java b/src/test/java/freemarker/test/servlet/WebAppTestCase.java
index 0366bde..ab14fb2 100644
--- a/src/test/java/freemarker/test/servlet/WebAppTestCase.java
+++ b/src/test/java/freemarker/test/servlet/WebAppTestCase.java
@@ -34,6 +34,10 @@
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
+import org.eclipse.jetty.annotations.ServletContainerInitializersStarter;
+import org.eclipse.jetty.apache.jsp.JettyJasperInitializer;
+import org.eclipse.jetty.plus.annotation.ContainerInitializer;
+import org.eclipse.jetty.server.NetworkConnector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.webapp.WebAppContext;
@@ -111,7 +115,7 @@
 
         ensureWebAppIsDeployed(webAppName);
 
-        final URI uri = new URI("http://localhost:" + server.getConnectors()[0].getLocalPort()
+        final URI uri = new URI("http://localhost:" + ((NetworkConnector) server.getConnectors()[0]).getLocalPort()
                 + "/" + webAppName + "/" + webAppRelURL);
 
         final HttpURLConnection httpCon = (HttpURLConnection) uri.toURL().openConnection();
@@ -234,6 +238,9 @@
         context.setAttribute(
                 ATTR_JETTY_CONTAINER_INCLUDE_JAR_PATTERN,
                 ".*taglib.*\\.jar$");
+
+        addJasperInitializer(context);
+
         contextHandlers.addHandler(context);
         // As we add this after the Server was started, it has to be started manually:
         context.start();
@@ -242,6 +249,20 @@
         LOG.info("Deployed web app.: {}", webAppName);
     }
 
+    /**
+     * Without this, we will have this error when loading a taglib:
+     * NullPointerException: Cannot invoke "org.apache.jasper.compiler.TldCache.getTldResourcePath(String)" because the
+     * return value of "org.apache.jasper.Options.getTldCache()" is null
+     */
+    private static void addJasperInitializer(WebAppContext context) {
+        JettyJasperInitializer jettyJasperInitializer = new JettyJasperInitializer();
+        ServletContainerInitializersStarter servletContainerInitializersStarter
+                = new ServletContainerInitializersStarter(context);
+        ContainerInitializer containerInitializer = new ContainerInitializer(jettyJasperInitializer, null);
+        context.setAttribute("org.eclipse.jetty.containerInitializers", List.of(containerInitializer));
+        context.addBean(servletContainerInitializersStarter, true);
+    }
+
     private static void deleteTemporaryDirectories() throws IOException {
         if (testTempDirectory.getParentFile() == null) {
             throw new IOException("Won't delete the root directory");
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index e3876ec..2ddfb82 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -26,6 +26,8 @@
 	</appender>
 	
 	<logger name="org.eclipse.jetty" level="INFO" />
+	<logger name="org.apache.tomcat" level="INFO" />
+	<logger name="org.apache.jasper" level="INFO" />
 
 	<root level="debug">
 		<appender-ref ref="STDOUT" />