RepoPilotOpen in app →

jetty/jetty.project

Eclipse Jetty® - Web Container & Clients - supports HTTP/3, HTTP/2, HTTP/1, websocket, servlets, and more

Healthy

Healthy across the board

weakest axis
Use as dependencyConcerns

non-standard license (Other)

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit today
  • 9 active contributors
  • Distributed ownership (top contributor 23% of recent commits)
Show all 7 evidence items →
  • Other licensed
  • CI configured
  • Tests present
  • Non-standard license (Other) — review terms
What would change the summary?
  • Use as dependency ConcernsMixed if: clarify license terms

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/jetty/jetty.project)](https://repopilot.app/r/jetty/jetty.project)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/jetty/jetty.project on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: jetty/jetty.project

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/jetty/jetty.project shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across the board

  • Last commit today
  • 9 active contributors
  • Distributed ownership (top contributor 23% of recent commits)
  • Other licensed
  • CI configured
  • Tests present
  • ⚠ Non-standard license (Other) — review terms

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live jetty/jetty.project repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/jetty/jetty.project.

What it runs against: a local clone of jetty/jetty.project — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in jetty/jetty.project | Confirms the artifact applies here, not a fork | | 2 | License is still Other | Catches relicense before you depend on it | | 3 | Default branch jetty-12.1.x exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>jetty/jetty.project</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of jetty/jetty.project. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/jetty/jetty.project.git
#   cd jetty.project
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of jetty/jetty.project and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "jetty/jetty.project(\\.git)?\\b" \\
  && ok "origin remote is jetty/jetty.project" \\
  || miss "origin remote is not jetty/jetty.project (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
  && ok "license is Other" \\
  || miss "license drift — was Other at generation time"

# 3. Default branch
git rev-parse --verify jetty-12.1.x >/dev/null 2>&1 \\
  && ok "default branch jetty-12.1.x exists" \\
  || miss "default branch jetty-12.1.x no longer exists"

# 4. Critical files exist
test -f "README.md" \\
  && ok "README.md" \\
  || miss "missing critical file: README.md"
test -f "pom.xml" \\
  && ok "pom.xml" \\
  || miss "missing critical file: pom.xml"
test -f "build/pom.xml" \\
  && ok "build/pom.xml" \\
  || miss "missing critical file: build/pom.xml"
test -f "Jenkinsfile" \\
  && ok "Jenkinsfile" \\
  || miss "missing critical file: Jenkinsfile"
test -f "CONTRIBUTING.md" \\
  && ok "CONTRIBUTING.md" \\
  || miss "missing critical file: CONTRIBUTING.md"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/jetty/jetty.project"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

Eclipse Jetty is a lightweight, asynchronous Java web server and Servlet container supporting HTTP/1, HTTP/2, HTTP/3, and WebSocket protocols. It solves the problem of needing a high-performance, embeddable Java web engine that can run standalone or be integrated directly into applications while maintaining full Servlet specification compliance and low-latency request handling. Maven monorepo where build/build-resources provides shared checkstyle (jetty-checkstyle.xml), code style configs (IntelliJ/Eclipse), and SpotlessMaven formatting rules. The .mvn/ directory contains Maven extensions (maven-build-cache-config.xml) and remote repository filters (.mvn/rrf/) controlling dependency resolution. GitHub Actions workflows in .github/workflows/ orchestrate CI (codeql-analysis.yml, merged-pr-label-check.yml). Module structure inferred: jetty-http*, jetty-servlet*, jetty-websocket* packages (not visible but typical for this org).

👥Who it's for

Java developers and DevOps engineers who need to deploy web applications (via WAR files in standalone mode) or embed a web server in Java applications. Advanced users leverage it for multi-version webapp support (EE8/EE11 simultaneous deployment) and custom protocol handling.

🌱Maturity & risk

Production-ready and actively maintained. The project is under Eclipse Foundation governance with version 12.1.10-SNAPSHOT indicating active development. Extensive CI/CD setup (.github/workflows/) and comprehensive Maven build infrastructure (.mvn/) show mature practices. The codebase has 45.7MB of Java code, indicating substantial scale and long-term stability.

Low risk for core stability but medium risk for contributors: the monorepo structure with interdependent modules (build/build-resources depends on no parent by design to avoid circular deps) means changes have wide impact. The snapshot version indicates rapid iteration; breaking changes between major versions (EE8→EE11 migration scripts exist in build/scripts/) require careful upgrade planning. No visible open-issue backlog data provided, but the complexity of multi-protocol support (HTTP/3, WebSocket) means edge cases may exist.

Active areas of work

Active snapshot development on v12.1.10. Build infrastructure recently modernized: SpotlessMaven 2.43.0 added for POM normalization, Maven Surefire 3.5.2 for testing. EE migration support (scripts for EE11↔EE10 conversion) indicates ongoing Java platform compliance updates. CodeQL and dependabot monitoring active (.github/dependabot.yml, .github/workflows/codeql-analysis.yml).

🚀Get running

git clone https://github.com/jetty/jetty.project.git
cd jetty.project
mvn -Pfast clean install

The -Pfast profile bypasses tests and checks for initial build speed. For full build with tests: mvn clean install (no profile).

Daily commands: Standalone server after build: java -jar jetty-home/start.jar --add-modules=http,ee11-deploy then place WAR files in webapps/. For embedded use in Java code: instantiate Server, add handlers (ServletContextHandler, custom Handler), call .start(). See README embedded examples for exact code patterns.

🗺️Map of the codebase

  • README.md — Entry point explaining Jetty's purpose, architecture, and basic usage patterns for HTTP/3, HTTP/2, HTTP/1, WebSocket, and servlet deployment.
  • pom.xml — Root Maven POM defining the monorepo structure, dependencies, and build configuration for all Jetty modules.
  • build/pom.xml — Build resources parent POM that configures code style, checkstyle, and build plugins used across all modules.
  • Jenkinsfile — CI/CD pipeline configuration defining how Jetty is tested, built, and released across multiple JVM versions.
  • CONTRIBUTING.md — Developer contribution guidelines covering code standards, testing requirements, and PR process for this complex multi-protocol server.
  • VERSION.txt — Current version definition (12.1.x branch) used throughout Maven builds and release automation.
  • .github/workflows — GitHub Actions workflows for automated CodeQL analysis, dependency checks, and PR label validation.

🛠️How to make changes

Add Documentation for a New Feature

  1. Create a new Java example file in the docs module following naming convention (e.g., HTTPClientDocs.java for HTTP features) (documentation/jetty/modules/code/examples/src/main/java/org/eclipse/jetty/docs/programming/)
  2. Add corresponding AsciiDoc page in the modules structure to reference and document the example (documentation/jetty/modules/ROOT/pages/)
  3. Update antora.yml to register the new documentation module in the navigation (documentation/jetty/antora.yml)

Add a New Build Module or Library

  1. Create new module directory with pom.xml inheriting from parent build-resources POM (build/pom.xml)
  2. Define dependencies and plugins using the inherited checkstyle and code style configurations (build/build-resources/src/main/resources/jetty-checkstyle.xml)
  3. Update root pom.xml to include the new module in <modules> section (pom.xml)
  4. Add module-specific configuration files (e.g., .mod files for modular deployments) (documentation/jetty/modules/code/examples/jetty-modules/)

Set Up Local Development Environment

  1. Review Maven configuration and build cache setup (.mvn/maven.config)
  2. Review contribution guidelines and code standards (CONTRIBUTING.md)
  3. Apply IDE-specific code style (IntelliJ or Eclipse configuration) (build/build-resources/jetty-codestyle-intellij.xml)
  4. Build project using root pom.xml and verify with local tests (pom.xml)

Release a New Version

  1. Update VERSION.txt with new version number following semantic versioning (VERSION.txt)
  2. Execute automated release script which handles tagging, artifact publishing, and GitHub release (build/scripts/release-jetty.sh)
  3. Review and merge release PR with changelog using GitHub release template (.github/ISSUE_TEMPLATE/release-template.md)

🔧Why these technologies

  • Java/JVM — Enables cross-platform web server, servlet compatibility, and high-performance async I/O with garbage collection management.
  • Maven — Multi-module build system supporting separate compilation, testing, and packaging of HTTP/1, HTTP/2, HTTP/3, WebSocket, and servlet modules.
  • Asynchronous I/O (Selector, Channel) — Required for high-concurrency, low-latency handling of thousands of concurrent HTTP connections without thread-per-connection overhead.
  • QUIC/HTTP/3 Protocol Stack — Modern protocol support providing reduced latency, connection migration, and improved performance over lossy networks.
  • Servlet API (EE10/EE11) — Standard Java web application interface maintained for backward compatibility while supporting modern async patterns.
  • Jenkins + GitHub Actions — Automated CI/CD for multi-JVM version testing, security scanning, and consistent artifact releases.

⚖️Trade-offs already made

  • Multi-module Maven monorepo structure

    • Why: Allows independent versioning of HTTP/2, HTTP/3, servlet, and client modules while maintaining coherent releases.
    • Consequence: Increased build complexity; contributors must understand module interdependencies and release coordination.
  • Support multiple protocol versions (HTTP/1, HTTP/2, HTTP/3) simultaneously

    • Why: Ensures compatibility with legacy clients while enabling performance-optimized protocols for modern applications.
    • Consequence: Larger codebase, more testing burden, and complexity in connection upgrade logic.
  • Both embedded and distributed deployment models

    • Why: Allows Jetty to serve diverse use cases: microservices, embedded applications, and traditional web servers.
    • Consequence: Must maintain multiple configuration and lifecycle patterns; documentation must cover both modes.
  • Non-blocking asynchronous architecture throughout

    • Why: Enables high concurrency and low memory footprint per connection compared to thread-per-request models.
    • Consequence: Steeper learning curve; requires understanding of Jetty's callback-based async patterns and selector management.

🚫Non-goals (don't propose these)

  • Does not implement application-level authentication (relies on servlet filters and external identity providers)
  • Not a traditional blocking servlet container; requires understanding of async paradigm for optimal usage
  • Does not provide clustering or distributed session management out-of-the-box
  • Not a reactive framework (uses callback-based async, not reactive streams)
  • Does not include a templating engine or MVC framework

🪤Traps & gotchas

Multi-version complexity: EE8 and EE11 WebApps can run simultaneously, but migration scripts (applyEE10ToEE11.sh) must be applied correctly or classloading fails. Maven build-cache (.mvn/maven-build-cache-config.xml) may mask stale artifacts—use mvn clean if strange compilation errors appear. Spotless POM formatter enforces specific XML ordering; hand-edited pom.xml files will be reformatted on first Maven run. Remote repository filters (.mvn/rrf/) may block unexpected dependencies—check groupId-*.txt if artifact resolution fails.

🏗️Architecture

💡Concepts to learn

  • Asynchronous I/O and Non-blocking Handlers — Jetty's entire architecture pivots on java.nio and async request handling; understanding SelectableChannel and CompletableFuture is essential to avoiding deadlocks and achieving the low-latency guarantees Jetty advertises
  • ALPN (Application-Layer Protocol Negotiation) — Critical for HTTP/2 and HTTP/3 negotiation during TLS handshake; Jetty's multi-protocol support depends on correct ALPN extension handling, and misconfiguration breaks modern protocol selection
  • Handler Chain Pattern — Jetty uses a chain-of-responsibility pattern for request processing (ServletContextHandler wraps handlers); understanding this is fundamental to custom request routing and middleware composition
  • Session Stickiness and Clustered Sessions — Multi-instance Jetty deployments require careful session management; the codebase handles session persistence and replication which are non-obvious pitfalls in production
  • WebSocket Frame Marshalling (RFC 6455) — Jetty implements raw WebSocket frame parsing and masking; this is a manual, error-prone process and understanding frame structure prevents security and reliability bugs
  • HTTP/3 and QUIC Protocol Layers — Jetty's HTTP/3 support requires understanding UDP-based QUIC semantics and connection migration, which differ fundamentally from TCP-based HTTP/1 and HTTP/2
  • Java Module System (JPMS) and Multi-Version JARs — Jetty's EE8/EE11 simultaneous support and snapshot version (12.1.10-SNAPSHOT) suggest use of module-info.java and possible MRJAR; critical for Java 9+ builds and module dependencies
  • tomcat/tomcat — Alternative Java Servlet container; direct competitor with similar deployment model and protocol support but different architecture
  • netty/netty — Lower-level async I/O framework that Jetty's HTTP/3 and protocol implementations likely build on or share patterns with
  • spring-projects/spring-boot — Embeds Jetty as optional servlet container; Spring Boot users often switch between Jetty, Tomcat, and Undertow via dependency injection
  • eclipse-ee4j/servlet-api — Official Servlet API specifications that Jetty implements; required reference for API compliance verification
  • grpc/grpc-java — Uses Jetty for HTTP/2 support in some configurations; represents a major downstream user of Jetty's protocol layers

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive HTTP/3 protocol integration tests

The README prominently advertises HTTP/3 support as a key feature, but there's no evidence of dedicated HTTP/3 test coverage in the partial file structure. Given that HTTP/3 is a newer protocol with complex state management, adding integration tests would ensure reliability and catch regressions. This is critical for a web server project where protocol correctness is paramount.

  • [ ] Create new test module at jetty-core/src/test/java/org/eclipse/jetty/http3/ for HTTP/3 protocol tests
  • [ ] Add unit tests for QUIC handshake, connection migration, and packet loss scenarios
  • [ ] Add integration tests in .github/workflows/ for HTTP/3 compatibility (similar to existing codeql-analysis.yml structure)
  • [ ] Reference existing HTTP/2 tests as patterns in jetty-core/src/test/java/org/eclipse/jetty/http2/
  • [ ] Document test execution in CONTRIBUTING.md

Implement dependency vulnerability scanning in Dependabot configuration

The repo has .github/dependabot.yml configured but the config appears minimal. For a security-critical web server project used in production, automated security updates for Maven dependencies are essential. Expanding the Dependabot configuration with security-focused settings would catch CVEs early and reduce security debt.

  • [ ] Expand .github/dependabot.yml to enable security updates with auto-merge for patch versions
  • [ ] Add GitHub Action workflow (.github/workflows/security-updates.yml) to validate dependency upgrades
  • [ ] Configure version constraints in .mvn/maven-build-cache-config.xml to flag known vulnerable transitive deps
  • [ ] Reference SECURITY.md policies in the Dependabot configuration for consistency
  • [ ] Document the security update process in CONTRIBUTING.md

Add missing module documentation and generated reference in documentation/jetty/modules/

The documentation structure shows only skeleton examples (jpms.mod, jvm.mod) in documentation/jetty/modules/code/examples/jetty-modules/, but the actual production modules are not documented. This creates a gap for users trying to understand available Jetty modules. Adding auto-generated module reference documentation would improve discoverability and maintenance.

  • [ ] Create Maven plugin configuration in build/pom.xml to scan jetty-core/src/main/config/modules/ and generate module documentation
  • [ ] Generate AsciiDoc module reference at documentation/jetty/modules/ROOT/pages/modules-reference.adoc listing all available .mod files
  • [ ] Add descriptions for core modules like http, http2, http3, ee11-deploy, ssl, etc. with configuration examples
  • [ ] Create a module selection guide at documentation/jetty/modules/ROOT/pages/module-selection.adoc with decision trees
  • [ ] Update README.md to link to the new module reference documentation

🌿Good first issues

  • Add integration test coverage for HTTP/3 connection upgrades from HTTP/1.1 with Alt-Svc header—HTTP/3 support exists but test gaps are likely given protocol complexity.
  • Document the multi-version webapp deployment feature (.properties environment override) with a concrete example in docs/ (inferred missing since not in repo file list).
  • Extend CheckStyle rules in build/build-resources/src/main/resources/jetty-checkstyle.xml to flag common WebSocket frame marshalling errors (since WebSocket code is hand-written, custom rules would catch bugs early).

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 9dc4888 — [12.1.x EE8] Bump the dev-dependencies group (#15002) (dependabot[bot])
  • a2267a1 — Merge pull request #15024 from jetty/release/12.1.9 (olamy)
  • 6db8f6c — Revert "Issue #15011 - Fix PathResource.newResource(String) issue on Microsoft Windows." (joakime)
  • 2472361 — Issue #15011 - Fix PathResource.newResource(String) issue on Microsoft Windows. (joakime)
  • 5b82461 — Merge pull request #14976 from olamy/fix/12.1.x/tck-AsyncContextTests-fixes (olamy)
  • 2e49e72 — Updating to version 12.1.10-SNAPSHOT (olamy)
  • b1fb145 — Updating to version 12.1.9 (olamy)
  • 7016f08 — Jetty 12.1.x Fix last TCK failure (olamy)
  • 6ca6c9a — Fixes #14564 - Jetty 12.1.x TLS connections hang after several requests with internal HTTPS self-requests. (sbordet)
  • 98524be — Fixes #14541 - Jetty HTTP Client - setMaxRequestHeadersSize resulting in java.lang.OutOfMemoryError (sbordet)

🔒Security observations

The Jetty project demonstrates a mature security posture with a dedicated SECURITY.md policy and clear vulnerability reporting guidelines. The codebase structure shows good separation of concerns and proper use of Maven for dependency management. No critical vulnerabilities were identified in the analyzed configuration files. Primary concerns are around dependency version management practices and build configuration review. The project's explicit policy against AI-generated unverified security reports is commendable. Key recommendations include implementing automated dependency scanning, maintaining regular security audits of repository sources, and ensuring no sensitive material is accidentally committed.

  • Medium · Dependency Version Management - Spotless Maven Plugin — build/build-resources/pom.xml - spotless-maven-plugin plugin declaration. The spotless-maven-plugin version 2.43.0 is hardcoded in the pom.xml. While this ensures reproducibility, it may prevent automatic security updates. Regular dependency scanning should be implemented to identify vulnerable transitive dependencies. Fix: Implement automated dependency vulnerability scanning using tools like OWASP Dependency-Check or Snyk. Regularly review and update plugin versions to patch security issues.
  • Low · Potential Information Disclosure in KEYS.txt — KEYS.txt. The KEYS.txt file is present in the repository root, which typically contains PGP public keys. While public keys are not secrets, their presence should be verified to ensure no private keys or sensitive key material are accidentally committed. Fix: Verify that KEYS.txt contains only public keys. Implement pre-commit hooks to prevent private keys from being committed. Consider using git-secrets or similar tools.
  • Low · Build Cache Configuration Exposure — .mvn/maven-build-cache-config.xml. The maven-build-cache-config.xml file in .mvn directory may contain sensitive build configuration. While currently not visible in the provided content, build cache configurations could potentially expose build paths, artifacts, or other metadata. Fix: Review the build cache configuration to ensure no sensitive information is stored. Restrict access to .mvn directory in CI/CD environments.
  • Low · Multiple Repository References (RRF) — .mvn/rrf/ directory with multiple groupId files. The .mvn/rrf directory contains multiple repository configuration files for different artifact sources (confluent, google, maven-central, hazelcast, redhat). While this enables flexibility, it increases the attack surface if any repository is compromised. Fix: Regularly audit repository sources. Use repository mirroring and checksums validation. Implement repository access controls and monitor for suspicious artifact downloads.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · jetty/jetty.project — RepoPilot