Apache JSTL dependency aggregation module for Eclipse Jetty web applications
—
Configuration utilities and integration patterns for enabling JSTL functionality within Eclipse Jetty web applications, including WebAppContext setup and container include patterns.
Centralized configuration utility for setting up JSP and JSTL processing in Jetty WebAppContext instances.
package org.eclipse.jetty.jstl;
public class JspConfig {
/**
* Initialize WebAppContext for JSP and JSTL processing.
*
* Configures servlet context temporary directory, container include JAR patterns,
* and resource base paths for proper JSTL library loading and JSP compilation.
*
* @param context WebAppContext to configure for JSTL support
* @param baseUri Base URI for the web application resources
* @param scratchDir Temporary directory for JSP compilation artifacts
*/
public static void init(WebAppContext context, URI baseUri, File scratchDir);
}Usage Example:
import org.eclipse.jetty.jstl.JspConfig;
import org.eclipse.jetty.webapp.WebAppContext;
import java.io.File;
import java.net.URI;
// Create WebAppContext
WebAppContext context = new WebAppContext();
context.setContextPath("/myapp");
// Setup directories
File webAppDir = new File("src/main/webapp");
File scratchDir = new File("target/jsp-scratch");
// Initialize JSTL configuration
JspConfig.init(context, webAppDir.toURI(), scratchDir);
// Additional context configuration
context.addConfiguration(new AnnotationConfiguration());The module configures specific JAR patterns to ensure JSTL libraries are properly included in the web application classpath.
// Configured JAR patterns for container inclusion:
String CONTAINER_INCLUDE_JAR_PATTERN =
".*/jetty-jakarta-servlet-api-[^/]*\\.jar$|" +
".*jakarta.servlet.jsp.jstl-[^/]*\\.jar|" +
".*taglibs-standard.*\\.jar";This pattern ensures the following JARs are included:
jakarta.servlet.jsp.jstl)taglibs-standard)Jetty module descriptor that enables JSTL support system-wide.
# Module: apache-jstl.mod
[description]
Enables the apache version of JSTL for all webapps.
[lib]
lib/apache-jstl/*.jarModule Activation:
# Command line activation
java -jar jetty-start.jar --module=apache-jstl
# Or via start.ini
--module=apache-jstlThe JspConfig.init() method performs the following configuration steps:
Temporary Directory Setup:
context.setAttribute("jakarta.servlet.context.tempdir", scratchDir);Container Include Pattern Configuration:
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/jetty-jakarta-servlet-api-[^/]*\\.jar$|.*jakarta.servlet.jsp.jstl-[^/]*\\.jar|.*taglibs-standard.*\\.jar");Resource Base Configuration:
context.setWar(baseUri.toASCIIString());
context.setResourceBase(baseUri.toASCIIString());Complete example of setting up a test environment with JSTL support:
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.jstl.JspConfig;
public class JstlTestSetup {
public static Server createTestServer() throws Exception {
// Create server
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0); // Use random available port
server.addConnector(connector);
// Setup web application directory
File testWebAppDir = new File("src/test/webapp");
File scratchDir = new File("target/test-scratch");
FS.ensureEmpty(scratchDir);
// Configure WebAppContext
WebAppContext context = new WebAppContext();
context.setContextPath("/");
// Initialize JSTL configuration
JspConfig.init(context, testWebAppDir.toURI(), scratchDir);
// Add annotation processing
context.addConfiguration(new AnnotationConfiguration());
server.setHandler(context);
return server;
}
}Maven dependency configuration for production deployment:
<dependencies>
<!-- Apache JSTL Module -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jstl</artifactId>
<version>11.0.0</version>
</dependency>
<!-- Jetty WebApp support -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>11.0.0</version>
</dependency>
<!-- JSP support (if needed) -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>11.0.0</version>
</dependency>
</dependencies>Example of integrating custom tag libraries alongside JSTL:
// Create custom tag library JAR
File libDir = new File(webAppDir, "WEB-INF/lib");
FS.ensureDirExists(libDir);
File customTagLibDir = new File("src/main/taglib");
JAR.create(customTagLibDir, new File(libDir, "custom-taglib.jar"));
// Configure context with both JSTL and custom tags
JspConfig.init(context, webAppDir.toURI(), scratchDir);// Core Jetty types
class WebAppContext {
void setAttribute(String name, Object value);
void setWar(String war);
void setResourceBase(String resourceBase);
void setContextPath(String contextPath);
void addConfiguration(Configuration configuration);
}
class Server {
void addConnector(Connector connector);
void setHandler(Handler handler);
void start() throws Exception;
void stop() throws Exception;
}
class ServerConnector {
ServerConnector(Server server);
void setPort(int port);
int getLocalPort();
String getHost();
}
// Standard Java types
class URI {
String toASCIIString();
}
class File {
URI toURI();
// Standard file operations
}Common integration issues and solutions:
Install with Tessl CLI
npx tessl i tessl/maven-org-eclipse-jetty--apache-jstl