This is an automated email from the ASF dual-hosted git repository.

cshannon pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq.git

commit d31d590f0bc29a7927399beffe10dd8279e40284
Author: Matt Pavlovich <[email protected]>
AuthorDate: Thu May 30 08:16:02 2024 -0500

    [AMQ-9359] Jetty-12 conversion
---
 activemq-amqp/pom.xml                              |   2 +-
 activemq-http/pom.xml                              |  32 +++++-
 .../transport/WebTransportServerSupport.java       |  26 +++--
 .../discovery/http/EmbeddedJettyServer.java        |   4 +-
 .../transport/http/HttpTransportServer.java        |  15 +--
 .../activemq/transport/ws/StompWSConnection.java   |   8 +-
 .../activemq/transport/ws/WSTransportProxy.java    |   8 +-
 .../activemq/transport/ws/WSTransportServer.java   |  17 ++--
 .../ws/{jetty11 => jetty12}/MQTTSocket.java        |   6 +-
 .../ws/{jetty11 => jetty12}/StompSocket.java       |   6 +-
 .../ws/{jetty11 => jetty12}/WSServlet.java         |  14 +--
 .../transport/http/HttpTraceTestSupport.java       |   8 +-
 .../activemq/transport/ws/MQTTWSConnection.java    |  37 ++++---
 .../transport/ws/MQTTWSSubProtocolTest.java        |   2 +-
 .../activemq/transport/ws/MQTTWSTransportTest.java |  12 ++-
 .../transport/ws/MQTTWSTransportWillTest.java      |   2 +-
 .../apache/activemq/transport/ws/SocketTest.java   |   8 +-
 .../transport/ws/StompWSSubProtocolTest.java       |   2 +-
 .../transport/ws/StompWSTransportTest.java         |   2 +-
 .../activemq/transport/ws/WSTransportTest.java     |  10 +-
 .../transport/wss/WSSTransportHttpTraceTest.java   |   2 +-
 .../wss/WSSTransportNeedClientAuthTest.java        |   4 +-
 .../transport/xstream/XStreamWireFormatTest.java   |   1 -
 activemq-http/src/test/resources/spring-http.xml   |   2 +-
 activemq-web-console/pom.xml                       |   9 +-
 .../java/org/apache/activemq/web/tool/Main.java    |  17 ++--
 activemq-web-demo/pom.xml                          |   5 +
 .../java/org/apache/activemq/web/AjaxTest.java     |  51 +++++-----
 .../java/org/apache/activemq/web/JettyServer.java  |   6 +-
 .../org/apache/activemq/web/JettyTestSupport.java  |   6 +-
 .../apache/activemq/web/RestPersistentTest.java    |  28 +++--
 .../java/org/apache/activemq/web/RestTest.java     | 113 +++++++++++----------
 activemq-web/pom.xml                               |   8 +-
 .../apache/activemq/web/config/JspConfigurer.java  |   9 +-
 assembly/pom.xml                                   |  87 ++++++++++++++--
 assembly/src/main/descriptors/common-bin.xml       |  28 +++--
 assembly/src/release/conf/jetty.xml                |  57 +++++------
 pom.xml                                            |  12 ++-
 38 files changed, 412 insertions(+), 254 deletions(-)

diff --git a/activemq-amqp/pom.xml b/activemq-amqp/pom.xml
index 610b4ec80d..9d0ee6db49 100644
--- a/activemq-amqp/pom.xml
+++ b/activemq-amqp/pom.xml
@@ -118,7 +118,7 @@
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-jetty-server</artifactId>
+      <artifactId>jetty-websocket-jetty-server</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/activemq-http/pom.xml b/activemq-http/pom.xml
index 2bae67a3f1..2aa5f75619 100644
--- a/activemq-http/pom.xml
+++ b/activemq-http/pom.xml
@@ -65,8 +65,8 @@
       <artifactId>jetty-xml</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-webapp</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.httpcomponents</groupId>
@@ -115,13 +115,37 @@
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-jetty-client</artifactId>
+      <artifactId>jetty-websocket-core-client</artifactId>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>jetty-websocket-core-server</artifactId>
       <scope>provided</scope>
       <optional>true</optional>
     </dependency>
+    <dependency>
+        <groupId>org.eclipse.jetty.websocket</groupId>
+        <artifactId>jetty-websocket-jetty-client</artifactId>
+        <scope>provided</scope>
+        <optional>true</optional>
+    </dependency>
     <dependency>
       <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-jetty-server</artifactId>
+      <artifactId>jetty-websocket-jetty-api</artifactId>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-jakarta-client</artifactId>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-jetty-server</artifactId>
       <scope>provided</scope>
       <optional>true</optional>
     </dependency>
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java
index f258e96854..21a7b4e6fd 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java
@@ -21,15 +21,14 @@ import java.net.InetAddress;
 import java.net.URI;
 import java.util.Map;
 
-import org.apache.activemq.transport.http.BlockingQueueTransport;
 import org.apache.activemq.util.InetAddressUtil;
 import org.apache.activemq.util.IntrospectionSupport;
-import org.eclipse.jetty.security.ConstraintMapping;
-import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.ee9.nested.ServletConstraint;
+import org.eclipse.jetty.ee9.security.ConstraintMapping;
+import org.eclipse.jetty.ee9.security.ConstraintSecurityHandler;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.security.Constraint;
+import org.eclipse.jetty.util.resource.ResourceFactory;
 import org.eclipse.jetty.xml.XmlConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,13 +56,13 @@ abstract public class WebTransportServerSupport extends 
TransportServerSupport {
     protected void createServer() {
         LOG.info("Starting Jetty server");
         if (jettyOptions.getConfig() != null) {
-            try {
+            try (ResourceFactory.Closeable resourceFactory = 
ResourceFactory.closeable()) {
                 LOG.info("Configuring Jetty server using {}", 
jettyOptions.getConfig());
                 File file = new File(jettyOptions.getConfig());
                 if (!file.exists()) {
                     throw new IllegalArgumentException("Jetty XML not found: " 
+ file.getAbsolutePath());
                 }
-                XmlConfiguration xmlConfiguration = new 
XmlConfiguration(Resource.newResource(file));
+                XmlConfiguration xmlConfiguration = new 
XmlConfiguration(resourceFactory.newResource(file.getPath()));
                 server = (Server) xmlConfiguration.configure();
             } catch (Throwable t) {
                 throw new IllegalStateException("Jetty configuration can't be 
loaded", t);
@@ -111,12 +110,17 @@ abstract public class WebTransportServerSupport extends 
TransportServerSupport {
 
     protected void configureTraceMethod(ConstraintSecurityHandler 
securityHandler,
             boolean enableTrace) {
-        Constraint constraint = new Constraint();
-        constraint.setName("trace-security");
+
+        ServletConstraint servletConstraint;
         //If enableTrace is true, then we want to set authenticate to false to 
allow it
-        constraint.setAuthenticate(!enableTrace);
+        if(enableTrace) {
+            servletConstraint = new ServletConstraint("trace-security", 
ServletConstraint.ANY_AUTH);
+        } else {
+            servletConstraint = new ServletConstraint("trace-security", 
ServletConstraint.ANY_ROLE);
+        }
+
         ConstraintMapping mapping = new ConstraintMapping();
-        mapping.setConstraint(constraint);
+        mapping.setConstraint(servletConstraint);
         mapping.setMethod("TRACE");
         mapping.setPathSpec("/");
         securityHandler.addConstraintMapping(mapping);
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java
index 786e3aac8d..0c996292cf 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java
@@ -19,8 +19,8 @@ package org.apache.activemq.transport.discovery.http;
 import java.net.URI;
 
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee9.servlet.ServletHolder;
 
 public class EmbeddedJettyServer implements org.apache.activemq.Service {
 
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java
index 5b21f0a9cc..4b354ceb76 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java
@@ -27,14 +27,15 @@ import 
org.apache.activemq.transport.WebTransportServerSupport;
 import org.apache.activemq.transport.util.TextWireFormat;
 import org.apache.activemq.transport.xstream.XStreamWireFormat;
 import org.apache.activemq.util.ServiceStopper;
-import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.ee9.security.ConstraintSecurityHandler;
 import org.eclipse.jetty.server.ConnectionFactory;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerWrapper;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.server.Handler.Wrapper;
+import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee9.servlet.ServletHolder;
 
 public class HttpTransportServer extends WebTransportServerSupport {
 
@@ -135,11 +136,11 @@ public class HttpTransportServer extends 
WebTransportServerSupport {
     }
 
     private void addGzipHandler(ServletContextHandler contextHandler) throws 
Exception {
-        HandlerWrapper handler = null;
+        Handler.Wrapper handler = null;
         try {
-            handler = (HandlerWrapper) 
forName("org.eclipse.jetty.servlets.gzip.GzipHandler").getConstructor().newInstance();
+            handler = (Handler.Wrapper) 
forName("org.eclipse.jetty.servlets.gzip.GzipHandler").getConstructor().newInstance();
         } catch (Throwable t) {
-            handler = (HandlerWrapper) 
forName("org.eclipse.jetty.server.handler.gzip.GzipHandler").getConstructor().newInstance();
+            handler = (Handler.Wrapper) 
forName("org.eclipse.jetty.server.handler.gzip.GzipHandler").getConstructor().newInstance();
         }
         contextHandler.insertHandler(handler);
     }
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java
index 8c0fccb1cc..f052b7d966 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java
@@ -25,9 +25,9 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.activemq.transport.stomp.StompFrame;
 import org.apache.activemq.transport.stomp.StompWireFormat;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketAdapter;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketAdapter;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -142,7 +142,7 @@ public class StompWSConnection extends WebSocketAdapter 
implements WebSocketList
     }
 
     @Override
-    public void onWebSocketConnect(org.eclipse.jetty.websocket.api.Session 
session) {
+    public void onWebSocketConnect(org.eclipse.jetty.ee9.websocket.api.Session 
session) {
         this.connection = session;
         this.connection.setIdleTimeout(Duration.ZERO);
         this.connectLatch.countDown();
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java
index a8242d4edd..dde57bbaf3 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java
@@ -34,8 +34,8 @@ import org.apache.activemq.util.IOExceptionSupport;
 import org.apache.activemq.util.IntrospectionSupport;
 import org.apache.activemq.util.ServiceStopper;
 import org.apache.activemq.wireformat.WireFormat;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -222,8 +222,8 @@ public final class WSTransportProxy extends 
TransportSupport implements Transpor
         this.session.setIdleTimeout(Duration.ZERO);
 
         if (wsTransport.getMaxFrameSize() > 0) {
-            
this.session.getPolicy().setMaxBinaryMessageSize(wsTransport.getMaxFrameSize());
-            
this.session.getPolicy().setMaxTextMessageSize(wsTransport.getMaxFrameSize());
+            
this.session.setMaxBinaryMessageSize(wsTransport.getMaxFrameSize());
+            this.session.setMaxTextMessageSize(wsTransport.getMaxFrameSize());
         }
     }
 
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java
index 75cf1fd56c..4c7357a711 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java
@@ -21,24 +21,22 @@ import java.net.InetSocketAddress;
 import java.net.URI;
 import java.util.Map;
 
-import jakarta.servlet.Servlet;
-
 import org.apache.activemq.broker.BrokerService;
 import org.apache.activemq.broker.BrokerServiceAware;
 import org.apache.activemq.command.BrokerInfo;
 import org.apache.activemq.transport.SocketConnectorFactory;
 import org.apache.activemq.transport.WebTransportServerSupport;
-import org.apache.activemq.transport.ws.jetty11.WSServlet;
+import org.apache.activemq.transport.ws.jetty12.WSServlet;
 import org.apache.activemq.util.IntrospectionSupport;
 import org.apache.activemq.util.ServiceStopper;
-import org.eclipse.jetty.security.ConstraintSecurityHandler;
 import org.eclipse.jetty.server.ConnectionFactory;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import 
org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
+import org.eclipse.jetty.ee9.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee9.servlet.ServletHolder;
+import 
org.eclipse.jetty.ee9.websocket.server.config.JettyWebSocketServletContainerInitializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,6 +75,7 @@ public class WSTransportServer extends 
WebTransportServerSupport implements Brok
 
         ServletContextHandler contextHandler =
                 new ServletContextHandler(server, "/", 
ServletContextHandler.SECURITY);
+        // server.setHandler(contextHandler); Future: Jetty 12 EE10 API change
 
         ServletHolder holder = new ServletHolder();
         JettyWebSocketServletContainerInitializer.configure(contextHandler, 
null);
@@ -96,7 +95,7 @@ public class WSTransportServer extends 
WebTransportServerSupport implements Brok
         contextHandler.addServlet(holder, "/");
 
         contextHandler.setAttribute("acceptListener", getAcceptListener());
-
+ 
         server.start();
 
         // Update the Connect To URI with our actual location in case the 
configured port
@@ -118,7 +117,7 @@ public class WSTransportServer extends 
WebTransportServerSupport implements Brok
         LOG.info("Listening for connections at {}", getConnectURI());
     }
 
-    private Servlet createWSServlet() throws Exception {
+    private WSServlet createWSServlet() throws Exception {
         servlet = new WSServlet();
         servlet.setTransportOptions(transportOptions);
         servlet.setBrokerService(brokerService);
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/MQTTSocket.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/MQTTSocket.java
similarity index 96%
rename from 
activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/MQTTSocket.java
rename to 
activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/MQTTSocket.java
index 853c201c34..6e14b9ec37 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/MQTTSocket.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/MQTTSocket.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.transport.ws.jetty11;
+package org.apache.activemq.transport.ws.jetty12;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -26,8 +26,8 @@ import org.apache.activemq.transport.mqtt.MQTTCodec;
 import org.apache.activemq.transport.ws.AbstractMQTTSocket;
 import org.apache.activemq.util.ByteSequence;
 import org.apache.activemq.util.IOExceptionSupport;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.DataByteArrayInputStream;
 import org.fusesource.mqtt.codec.DISCONNECT;
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/StompSocket.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/StompSocket.java
similarity index 95%
rename from 
activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/StompSocket.java
rename to 
activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/StompSocket.java
index 5c718c8ab0..2a47a5156c 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/StompSocket.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/StompSocket.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.transport.ws.jetty11;
+package org.apache.activemq.transport.ws.jetty12;
 
 import java.io.IOException;
 import java.time.Duration;
@@ -24,8 +24,8 @@ import org.apache.activemq.transport.stomp.Stomp;
 import org.apache.activemq.transport.stomp.StompFrame;
 import org.apache.activemq.transport.ws.AbstractStompSocket;
 import org.apache.activemq.util.IOExceptionSupport;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/WSServlet.java
 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/WSServlet.java
similarity index 94%
rename from 
activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/WSServlet.java
rename to 
activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/WSServlet.java
index 607248e4de..86183c8c4f 100644
--- 
a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/WSServlet.java
+++ 
b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/WSServlet.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.transport.ws.jetty11;
+package org.apache.activemq.transport.ws.jetty12;
 
 import java.io.IOException;
 import java.net.URI;
@@ -38,12 +38,12 @@ import 
org.apache.activemq.transport.TransportAcceptListener;
 import org.apache.activemq.transport.TransportFactory;
 import org.apache.activemq.transport.util.HttpTransportUtils;
 import org.apache.activemq.transport.ws.WSTransportProxy;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
-import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest;
-import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse;
-import org.eclipse.jetty.websocket.server.JettyWebSocketCreator;
-import org.eclipse.jetty.websocket.server.JettyWebSocketServlet;
-import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.server.JettyServerUpgradeRequest;
+import org.eclipse.jetty.ee9.websocket.server.JettyServerUpgradeResponse;
+import org.eclipse.jetty.ee9.websocket.server.JettyWebSocketCreator;
+import org.eclipse.jetty.ee9.websocket.server.JettyWebSocketServlet;
+import org.eclipse.jetty.ee9.websocket.server.JettyWebSocketServletFactory;
 
 /**
  * Handle connection upgrade requests and creates web sockets
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java
index 0eb35f6cf5..b55d45bc48 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java
@@ -24,10 +24,10 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.BufferingResponseListener;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.io.ClientConnector;
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java
index e127d077d0..845de35bdf 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java
@@ -27,9 +27,9 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.activemq.transport.mqtt.MQTTWireFormat;
 import org.apache.activemq.util.ByteSequence;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketAdapter;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketAdapter;
+import org.eclipse.jetty.websocket.api.Session.Listener.AutoDemanding;
 import org.fusesource.hawtbuf.UTF8Buffer;
 import org.fusesource.mqtt.codec.CONNACK;
 import org.fusesource.mqtt.codec.CONNECT;
@@ -49,13 +49,12 @@ import org.slf4j.LoggerFactory;
 /**
  * Implements a simple WebSocket based MQTT Client that can be used for unit 
testing.
  */
-public class MQTTWSConnection extends WebSocketAdapter implements 
WebSocketListener {
+public class MQTTWSConnection extends WebSocketAdapter implements 
AutoDemanding {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(MQTTWSConnection.class);
 
     private static final MQTTFrame PING_RESP_FRAME = new PINGRESP().encode();
 
-    private Session connection;
     private final CountDownLatch connectLatch = new CountDownLatch(1);
     private final MQTTWireFormat wireFormat = new MQTTWireFormat();
 
@@ -67,17 +66,17 @@ public class MQTTWSConnection extends WebSocketAdapter 
implements WebSocketListe
 
     @Override
     public boolean isConnected() {
-        return connection != null ? connection.isOpen() : false;
+        return getSession() != null ? getSession().isOpen() : false;
     }
 
     public void close() {
-        if (connection != null) {
-            connection.close();
+        if (getSession() != null) {
+            getSession().close();
         }
     }
 
     protected Session getConnection() {
-        return connection;
+        return getSession();
     }
 
     //----- Connection and Disconnection methods 
-----------------------------//
@@ -193,7 +192,7 @@ public class MQTTWSConnection extends WebSocketAdapter 
implements WebSocketListe
             frame = (MQTTFrame)wireFormat.unmarshal(new ByteSequence(data, 
offset, length));
         } catch (IOException e) {
             LOG.error("Could not decode incoming MQTT Frame: {}", 
e.getMessage());
-            connection.close();
+            getSession().close();
         }
 
         try {
@@ -243,11 +242,11 @@ public class MQTTWSConnection extends WebSocketAdapter 
implements WebSocketListe
                 break;
             default:
                 LOG.error("Unknown MQTT  Frame received.");
-                connection.close();
+                getSession().close();
             }
         } catch (Exception e) {
             LOG.error("Could not decode incoming MQTT Frame: {}", 
e.getMessage());
-            connection.close();
+            getSession().close();
         }
     }
 
@@ -255,11 +254,11 @@ public class MQTTWSConnection extends WebSocketAdapter 
implements WebSocketListe
 
     private void sendBytes(ByteSequence payload) throws IOException {
         if (!isWritePartialFrames()) {
-            connection.getRemote().sendBytes(ByteBuffer.wrap(payload.data, 
payload.offset, payload.length));
+            getRemote().sendBytes(ByteBuffer.wrap(payload.data, 
payload.offset, payload.length));
         } else {
-            connection.getRemote().sendBytes(ByteBuffer.wrap(
+            getRemote().sendBytes(ByteBuffer.wrap(
                 payload.data, payload.offset, payload.length / 2));
-            connection.getRemote().sendBytes(ByteBuffer.wrap(
+            getRemote().sendBytes(ByteBuffer.wrap(
                 payload.data, payload.offset + payload.length / 2, 
payload.length / 2));
         }
     }
@@ -274,16 +273,16 @@ public class MQTTWSConnection extends WebSocketAdapter 
implements WebSocketListe
     public void onWebSocketClose(int statusCode, String reason) {
         LOG.trace("MQTT WS Connection closed, code:{} message:{}", statusCode, 
reason);
 
-        this.connection = null;
+        getSession().close(statusCode, reason);
         this.closeCode = statusCode;
         this.closeMessage = reason;
 
     }
 
     @Override
-    public void onWebSocketConnect(org.eclipse.jetty.websocket.api.Session 
session) {
-        this.connection = session;
-        this.connection.setIdleTimeout(Duration.ZERO);
+    public void onWebSocketConnect(org.eclipse.jetty.ee9.websocket.api.Session 
session) {
+        super.onWebSocketConnect(session);
+        getSession().setIdleTimeout(Duration.ZERO);
         this.connectLatch.countDown();
     }
 }
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java
index 46aa692b6a..2afddf84fe 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java
@@ -22,7 +22,7 @@ import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
 import org.eclipse.jetty.io.ClientConnector;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java
index 9c524c4d3e..a92d7d7ff2 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.activemq.transport.ws;
 
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -23,14 +24,16 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.activemq.util.Wait;
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
 import org.eclipse.jetty.io.ClientConnector;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
 import org.eclipse.jetty.websocket.client.WebSocketClient;
 import org.fusesource.hawtbuf.UTF8Buffer;
@@ -86,7 +89,9 @@ public class MQTTWSTransportTest extends 
WSTransportTestSupport {
 
         wsMQTTConnection = new 
MQTTWSConnection().setWritePartialFrames(partialFrames);
 
-        wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+        CompletableFuture<Session> webSocketFuture = 
wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+        Session webSocketSession = webSocketFuture.get(30, TimeUnit.SECONDS);
+        assertNotNull(webSocketSession);
         if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) {
             throw new IOException("Could not connect to MQTT WS endpoint");
         }
@@ -114,7 +119,8 @@ public class MQTTWSTransportTest extends 
WSTransportTestSupport {
 
             wsMQTTConnection = new 
MQTTWSConnection().setWritePartialFrames(partialFrames);
 
-            wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+            CompletableFuture<Session> wsClientFuture = 
wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+            wsClientFuture.get(30,  TimeUnit.SECONDS);
             if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) {
                 throw new IOException("Could not connect to MQTT WS endpoint");
             }
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java
index 9f8d7abf40..a9998069e2 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java
@@ -26,7 +26,7 @@ import java.util.Collection;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
 import org.eclipse.jetty.io.ClientConnector;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java
index 76910dfee3..9f2aecfc84 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java
@@ -18,8 +18,8 @@ package org.apache.activemq.transport.ws;
 
 import static org.junit.Assert.assertEquals;
 
-import org.apache.activemq.transport.ws.jetty11.MQTTSocket;
-import org.apache.activemq.transport.ws.jetty11.StompSocket;
+import org.apache.activemq.transport.ws.jetty12.MQTTSocket;
+import org.apache.activemq.transport.ws.jetty12.StompSocket;
 import org.junit.Test;
 
 public class SocketTest {
@@ -31,8 +31,8 @@ public class SocketTest {
 
         assertEquals("ws://localhost:8080", 
stompSocketJetty8.getRemoteAddress());
 
-        org.apache.activemq.transport.ws.jetty11.StompSocket 
stompSocketJetty11 =
-                new 
org.apache.activemq.transport.ws.jetty11.StompSocket("ws://localhost:8080");
+        org.apache.activemq.transport.ws.jetty12.StompSocket 
stompSocketJetty11 =
+                new 
org.apache.activemq.transport.ws.jetty12.StompSocket("ws://localhost:8080");
 
         assertEquals("ws://localhost:8080", 
stompSocketJetty11.getRemoteAddress());
     }
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java
index 80a86c5d04..b689cca453 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java
@@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.activemq.transport.stomp.Stomp;
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
 import org.eclipse.jetty.io.ClientConnector;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java
index 83bb0e3aa5..10171510e4 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java
@@ -30,7 +30,7 @@ import org.apache.activemq.transport.stomp.StompFrame;
 import org.apache.activemq.util.Wait;
 import org.apache.activemq.util.Wait.Condition;
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
 import org.eclipse.jetty.io.ClientConnector;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
index d0e2d3bccc..870f35c930 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
@@ -32,17 +32,17 @@ import org.apache.activemq.broker.BrokerService;
 import org.apache.activemq.transport.SocketConnectorFactory;
 import org.apache.activemq.transport.stomp.StompConnection;
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.BufferingResponseListener;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.io.ClientConnector;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java
index e160047790..2e1faa727a 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java
@@ -25,7 +25,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-@Ignore
+
 @RunWith(Parameterized.class)
 public class WSSTransportHttpTraceTest extends WSTransportHttpTraceTest {
 
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java
index cfc9c73e5a..8553d555c2 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java
@@ -23,7 +23,7 @@ import org.apache.activemq.transport.stomp.StompFrame;
 import org.apache.activemq.transport.ws.MQTTWSConnection;
 import org.apache.activemq.transport.ws.StompWSConnection;
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
 import org.eclipse.jetty.io.ClientConnector;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.websocket.api.Session;
@@ -145,12 +145,12 @@ public class WSSTransportNeedClientAuthTest {
         MQTTWSConnection wsMQTTConnection = new MQTTWSConnection();
 
         wsClient.connect(wsMQTTConnection, new URI("wss://localhost:61618"), 
request);
+
         if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) {
             throw new IOException("Could not connect to MQTT WS endpoint");
         }
 
         wsMQTTConnection.connect();
-
         assertTrue("Client not connected", wsMQTTConnection.isConnected());
 
         wsMQTTConnection.disconnect();
diff --git 
a/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java
 
b/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java
index 5a5e611298..90a5c850dd 100644
--- 
a/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java
+++ 
b/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 
 import junit.framework.Test;
 import org.apache.activemq.command.ActiveMQTextMessage;
-import org.apache.activemq.command.Command;
 import org.apache.activemq.command.MessageTest;
 import org.apache.activemq.wireformat.WireFormat;
 import org.slf4j.Logger;
diff --git a/activemq-http/src/test/resources/spring-http.xml 
b/activemq-http/src/test/resources/spring-http.xml
index 1a65db4372..129ae77c8c 100644
--- a/activemq-http/src/test/resources/spring-http.xml
+++ b/activemq-http/src/test/resources/spring-http.xml
@@ -44,7 +44,7 @@
       <!-- lets wrap in a pool to avoid creating a connection per send -->
       <bean class="org.springframework.jms.connection.SingleConnectionFactory">
         <property name="targetConnectionFactory">
-          <ref local="jmsFactory" />
+          <ref bean="jmsFactory" />
         </property>
       </bean>
     </property>
diff --git a/activemq-web-console/pom.xml b/activemq-web-console/pom.xml
index 9e90f6e89c..04f5c2f5a2 100644
--- a/activemq-web-console/pom.xml
+++ b/activemq-web-console/pom.xml
@@ -248,6 +248,11 @@
     </dependency>
 
     <!-- web container -->
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-webapp</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-server</artifactId>
@@ -330,8 +335,8 @@
     </dependency>
     
     <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>apache-jsp</artifactId>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-apache-jsp</artifactId>
       <scope>provided</scope>
       <exclusions>
           <exclusion>
diff --git 
a/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java 
b/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java
index 443f102236..1f06c789ad 100644
--- a/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java
+++ b/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java
@@ -18,9 +18,11 @@
 package org.apache.activemq.web.tool;
 
 import org.apache.activemq.web.config.JspConfigurer;
+import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
 
 /**
  * A simple bootstrap class for starting Jetty in your IDE using the local web
@@ -50,22 +52,25 @@ public final class Main {
         System.out.println("Starting Web Server on port: " + port);
         System.setProperty("jetty.port", "" + port);
         Server server = new Server(port);
+        Handler.Sequence rootHandler = new Handler.Sequence();
+        server.setHandler(rootHandler);
 
         //System.setProperty("webconsole.type","properties");
         //System.setProperty("webconsole.jms.url","tcp://localhost:61616");
         
//System.setProperty("webconsole.jmx.url","service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root");
 
         WebAppContext context = new WebAppContext();
-        ContextHandlerCollection handlers = new ContextHandlerCollection();
-        handlers.setHandlers(new WebAppContext[] {context});
+        ResourceFactory resourceFactory = ResourceFactory.of(context);
+        context.setBaseResource(resourceFactory.newResource(WEBAPP_DIR));
 
-        JspConfigurer.configureJetty(server, handlers);
+        ContextHandlerCollection contextHandlers = new 
ContextHandlerCollection();
+        contextHandlers.addHandler(contextHandlers);
+        contextHandlers.addBean(context);
 
+        JspConfigurer.configureJetty(server, contextHandlers);
 
-        context.setResourceBase(WEBAPP_DIR);
         context.setContextPath(WEBAPP_CTX);
         context.setServer(server);
-        server.setHandler(handlers);
         server.start();
 
         System.out.println();
diff --git a/activemq-web-demo/pom.xml b/activemq-web-demo/pom.xml
index ec0c380a4a..19769639dc 100644
--- a/activemq-web-demo/pom.xml
+++ b/activemq-web-demo/pom.xml
@@ -188,6 +188,11 @@
       <artifactId>jetty-server</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-webapp</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-client</artifactId>
diff --git 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java
index f3f88d8d2d..c0b77c0896 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java
@@ -19,8 +19,8 @@ package org.apache.activemq.web;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import java.io.ByteArrayInputStream;
 import java.net.SocketTimeoutException;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -34,10 +34,10 @@ import org.apache.activemq.transport.stomp.Stomp;
 import org.apache.activemq.transport.stomp.StompConnection;
 import org.apache.activemq.transport.stomp.StompFrame;
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
-import org.eclipse.jetty.client.util.InputStreamContentProvider;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.BufferingResponseListener;
+import org.eclipse.jetty.client.BytesRequestContent;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpMethod;
 import org.junit.Test;
@@ -422,9 +422,9 @@ public class AjaxTest extends JettyTestSupport {
         final StringBuffer buf = new StringBuffer();
         httpClient
                 .newRequest("http://localhost:"; + port + "/amq")
-                .header("Content-Type", "application/x-www-form-urlencoded; 
charset=UTF-8")
-                .content(
-                        new InputStreamContentProvider(new 
ByteArrayInputStream(content)))
+                .headers(headers -> headers
+                        .put("Content-Type", 
"application/x-www-form-urlencoded; charset=UTF-8"))
+                .body(new BytesRequestContent(content))
                 .method(HttpMethod.POST).send(new BufferingResponseListener() {
                     @Override
                     public void onComplete(Result result) {
@@ -445,24 +445,28 @@ public class AjaxTest extends JettyTestSupport {
         final StringBuffer sessionId = new StringBuffer();
         Request request = httpClient.newRequest("http://localhost:"; + port + 
"/amq");
         if (selector != null) {
-            request.header("selector", selector);
+            request.headers(headers -> headers
+                    .put("selector", selector));
         }
         if (session != null) {
-            request.header(HttpHeader.COOKIE, session);
+            request.headers(headers -> headers
+                    .put(HttpHeader.COOKIE, session));
         }
-        request.header("Content-Type","application/x-www-form-urlencoded; 
charset=UTF-8")
-           .content(new InputStreamContentProvider(new 
ByteArrayInputStream(content.getBytes())))
-           .method(HttpMethod.POST).send(new BufferingResponseListener() {
-            @Override
-            public void onComplete(Result result) {
-                buf.append(getContentAsString());
-                String cookie = 
result.getResponse().getHeaders().get(HttpHeader.SET_COOKIE);
-                if (cookie != null) {
-                    String[] cookieParts = cookie.split(";");
-                    sessionId.append(cookieParts[0]);
+        request
+            .headers(headers -> headers
+                .put("Content-Type","application/x-www-form-urlencoded; 
charset=UTF-8"))
+            .body(new 
BytesRequestContent(content.getBytes(StandardCharsets.UTF_8)))
+            .method(HttpMethod.POST).send(new BufferingResponseListener() {
+                @Override
+                public void onComplete(Result result) {
+                    buf.append(getContentAsString());
+                    String cookie = 
result.getResponse().getHeaders().get(HttpHeader.SET_COOKIE);
+                    if (cookie != null) {
+                        String[] cookieParts = cookie.split(";");
+                        sessionId.append(cookieParts[0]);
+                    }
+                    latch.countDown();
                 }
-                latch.countDown();
-            }
         });
         latch.await();
 
@@ -474,7 +478,8 @@ public class AjaxTest extends JettyTestSupport {
         final CountDownLatch latch = new CountDownLatch(1);
         Request request = httpClient.newRequest(url);
         if (sessionId != null) {
-            request.header(HttpHeader.COOKIE, sessionId);
+            request.headers(headers -> headers
+                    .put(HttpHeader.COOKIE, sessionId));
         }
         request.send(new BufferingResponseListener() {
             @Override
diff --git 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java
index 8069954adc..eb5602eb04 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java
@@ -22,7 +22,8 @@ import org.apache.activemq.demo.DefaultQueueSender;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
 
 /**
  * A simple bootstrap class for starting Jetty in your IDE using the local web
@@ -66,8 +67,9 @@ public final class JettyServer {
         ServerConnector connector = new ServerConnector(server);
         connector.setPort(port);
         WebAppContext context = new WebAppContext();
+        ResourceFactory resourceFactory = ResourceFactory.of(context);
 
-        context.setResourceBase(WEBAPP_DIR);
+        context.setBaseResource(resourceFactory.newResource(WEBAPP_DIR));
         context.setContextPath(WEBAPP_CTX);
         context.setServer(server);
         server.setHandler(context);
diff --git 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java
index 59e957b595..7fd016d15e 100644
--- 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java
+++ 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java
@@ -36,7 +36,8 @@ import org.apache.activemq.util.Wait;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
 import org.junit.After;
 import org.junit.Before;
 import org.slf4j.Logger;
@@ -77,8 +78,9 @@ public class JettyTestSupport {
         ServerConnector connector = new ServerConnector(server);
         connector.setPort(port);
         WebAppContext context = new WebAppContext();
+        ResourceFactory resourceFactory = ResourceFactory.of(context);
 
-        context.setResourceBase("src/main/webapp");
+        
context.setBaseResource(resourceFactory.newResource("src/main/webapp"));
         context.setContextPath("/");
         context.setServer(server);
         server.setHandler(context);
diff --git 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java
 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java
index 61345eaa80..87382c55c2 100644
--- 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java
+++ 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java
@@ -25,10 +25,11 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
-import org.eclipse.jetty.client.util.InputStreamContentProvider;
+import org.eclipse.jetty.client.InputStreamRequestContent;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.BufferingResponseListener;
+import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.Ignore;
@@ -79,9 +80,12 @@ public class RestPersistentTest extends JettyTestSupport {
         final CountDownLatch latch = new CountDownLatch(1);
         final StringBuffer buf = new StringBuffer();
         final AtomicInteger status = new AtomicInteger();
+
+        
         httpClient.newRequest(url+"&"+properties)
-            .header("Content-Type","text/xml")
-           .content(new InputStreamContentProvider(new 
ByteArrayInputStream(message.getBytes("UTF-8"))))
+            .headers(headers -> headers 
+                    .put(HttpHeader.CONTENT_TYPE,"text/xml"))
+           .body(new InputStreamRequestContent(new 
ByteArrayInputStream(message.getBytes("UTF-8"))))
            .method(HttpMethod.POST).send(new BufferingResponseListener() {
             @Override
             public void onComplete(Result result) {
@@ -101,13 +105,15 @@ public class RestPersistentTest extends JettyTestSupport {
         final CountDownLatch latch = new CountDownLatch(1);
         final StringBuffer buf = new StringBuffer();
         final AtomicInteger status = new AtomicInteger();
+
         Request request = httpClient.newRequest(url)
-            .header("accept", "text/xml")
-            .header("Content-Type","text/xml");
+            .headers(headers -> headers
+                        .put("accept", "text/xml")
+                        .put("Content-Type","text/xml"));
 
-        if(selector!=null)
-        {
-            request.header("selector", selector);
+        if(selector != null) {
+            request.headers(headers -> headers
+                    .put("selector", selector));
         }
 
         request.method(HttpMethod.GET).send(new BufferingResponseListener() {
diff --git 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
index 1c94219712..cfb7ca0312 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
@@ -34,8 +34,8 @@ import jakarta.jms.TextMessage;
 import javax.management.ObjectName;
 
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.BufferingResponseListener;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpStatus;
@@ -149,24 +149,26 @@ public class RestTest extends JettyTestSupport {
         producer.send(msg2);
         LOG.info("message 2 sent");
 
-        HttpClient httpClient = new HttpClient();
-        httpClient.start();
-
         final StringBuffer buf = new StringBuffer();
         final CountDownLatch latch = new CountDownLatch(1);
-        httpClient.newRequest("http://localhost:"; + port + 
"/message/test?readTimeout=1000&type=queue")
-            .header("selector", "test=2").send(new BufferingResponseListener() 
{
-            @Override
-            public void onComplete(Result result) {
-                buf.append(getContentAsString());
-                latch.countDown();
-            }
-        });
-        latch.await();
+
+        try(HttpClient httpClient = new HttpClient()) {
+            httpClient.start();
+            httpClient.newRequest("http://localhost:"; + port + 
"/message/test?readTimeout=1000&type=queue")
+                .headers(headers -> headers
+                        .put("selector", "test=2"))
+                .send(new BufferingResponseListener() {
+                @Override
+                public void onComplete(Result result) {
+                    buf.append(getContentAsString());
+                    latch.countDown();
+                }
+            });
+            latch.await();
+        }
         assertEquals("test2", buf.toString());
     }
 
-
     // test for https://issues.apache.org/activemq/browse/AMQ-2827
     @Test(timeout = 15 * 1000)
     public void testCorrelation() throws Exception {
@@ -270,23 +272,25 @@ public class RestTest extends JettyTestSupport {
     public void testProperties() throws Exception {
         int port = getPort();
 
-        HttpClient httpClient = new HttpClient();
-        httpClient.start();
-
         final CountDownLatch latch = new CountDownLatch(1);
         final StringBuffer buf = new StringBuffer();
         final AtomicInteger status = new AtomicInteger();
-        httpClient.newRequest("http://localhost:"; + port + 
"/message/testPost?type=queue&property=value")
-           .method(HttpMethod.POST).send(new BufferingResponseListener() {
-            @Override
-            public void onComplete(Result result) {
-                status.getAndSet(result.getResponse().getStatus());
-                buf.append(getContentAsString());
-                latch.countDown();
-            }
-        });
 
-        latch.await();
+        try(HttpClient httpClient = new HttpClient()) {
+            httpClient.start();
+
+            httpClient.newRequest("http://localhost:"; + port + 
"/message/testPost?type=queue&property=value")
+               .method(HttpMethod.POST).send(new BufferingResponseListener() {
+                @Override
+                public void onComplete(Result result) {
+                    status.getAndSet(result.getResponse().getStatus());
+                    buf.append(getContentAsString());
+                    latch.countDown();
+                }
+            });
+            latch.await();
+        }
+
         assertTrue("success status", HttpStatus.isSuccess(status.get()));
 
         final CountDownLatch latch2 = new CountDownLatch(1);
@@ -294,16 +298,19 @@ public class RestTest extends JettyTestSupport {
         final AtomicInteger status2 = new AtomicInteger();
 
         final HttpFields.Mutable responseFields = HttpFields.build();
-        httpClient.newRequest("http://localhost:"; + port + 
"/message/testPost?readTimeout=1000&type=Queue")
-           .method(HttpMethod.GET).send(new BufferingResponseListener() {
-            @Override
-            public void onComplete(Result result) {
-                responseFields.add(result.getResponse().getHeaders());
-                status2.getAndSet(result.getResponse().getStatus());
-                buf2.append(getContentAsString());
-                latch2.countDown();
-            }
-        });
+        try(HttpClient httpClient = new HttpClient()) {
+            httpClient.start();
+            httpClient.newRequest("http://localhost:"; + port + 
"/message/testPost?readTimeout=1000&type=Queue")
+                .method(HttpMethod.GET).send(new BufferingResponseListener() {
+                @Override
+                public void onComplete(Result result) {
+                    responseFields.add(result.getResponse().getHeaders());
+                    status2.getAndSet(result.getResponse().getStatus());
+                    buf2.append(getContentAsString());
+                    latch2.countDown();
+                }
+                });
+        }
 
         latch2.await();
         assertTrue("success status", HttpStatus.isSuccess(status2.get()));
@@ -318,25 +325,25 @@ public class RestTest extends JettyTestSupport {
     public void testAuth() throws Exception {
         int port = getPort();
 
-        HttpClient httpClient = new HttpClient();
-        httpClient.start();
-
         final CountDownLatch latch = new CountDownLatch(1);
         final StringBuffer buf = new StringBuffer();
         final AtomicInteger status = new AtomicInteger();
-        httpClient.newRequest("http://localhost:"; + port + 
"/message/testPost?type=queue")
-            .header("Authorization", "Basic YWRtaW46YWRtaW4=")
-           .method(HttpMethod.POST).send(new BufferingResponseListener() {
-            @Override
-            public void onComplete(Result result) {
-                status.getAndSet(result.getResponse().getStatus());
-                buf.append(getContentAsString());
-                latch.countDown();
-            }
-        });
 
-
-        latch.await();
+        try(HttpClient httpClient = new HttpClient()) {
+            httpClient.start();
+            httpClient.newRequest("http://localhost:"; + port + 
"/message/testPost?type=queue")
+               .headers(headers -> headers
+                    .put("Authorization", "Basic YWRtaW46YWRtaW4="))
+               .method(HttpMethod.POST).send(new BufferingResponseListener() {
+                @Override
+                public void onComplete(Result result) {
+                    status.getAndSet(result.getResponse().getStatus());
+                    buf.append(getContentAsString());
+                    latch.countDown();
+                }
+            });
+            latch.await();
+        }
         assertTrue("success status", HttpStatus.isSuccess(status.get()));
     }
 
diff --git a/activemq-web/pom.xml b/activemq-web/pom.xml
index 11f556b220..4f67b91687 100644
--- a/activemq-web/pom.xml
+++ b/activemq-web/pom.xml
@@ -79,12 +79,12 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-webapp</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-jetty-server</artifactId>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-jetty-server</artifactId>
     </dependency>
 
     <!-- Just used for testing -->
diff --git 
a/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java 
b/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java
index aecff8d59d..6fe6d53779 100644
--- 
a/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java
+++ 
b/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java
@@ -18,9 +18,8 @@ package org.apache.activemq.web.config;
 
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.webapp.Configuration;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.server.Handler.Sequence;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
 
 /**
  *
@@ -28,7 +27,7 @@ import org.eclipse.jetty.webapp.WebAppContext;
  */
 public class JspConfigurer {
 
-    public static void configureJetty(Server server, HandlerCollection 
collection) {
+    public static void configureJetty(Server server, Sequence sequence) {
 //        Configuration.ClassList classlist = Configuration.ClassList
 //                .setServerDefault( server );
 //        classlist.addBefore(
@@ -39,7 +38,7 @@ public class JspConfigurer {
         // container-path jars for tlds, web-fragments etc.
         // If you omit the jar that contains the jstl .tlds, the jsp engine 
will
         // scan for them instead.
-        for (Handler handler: collection.getHandlers()) {
+        for (Handler handler: sequence.getHandlers()) {
             if (handler instanceof WebAppContext){
                 ((WebAppContext) handler).setAttribute(
                     
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
diff --git a/assembly/pom.xml b/assembly/pom.xml
index 424f0cccc2..135989e405 100644
--- a/assembly/pom.xml
+++ b/assembly/pom.xml
@@ -371,20 +371,45 @@
       <optional>false</optional>
     </dependency>
     <dependency>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-oxm</artifactId>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-oxm</artifactId>
     </dependency>
     <dependency>
       <groupId>org.codehaus.jettison</groupId>
       <artifactId>jettison</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-webapp</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-nested</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-security</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9</groupId>
+      <artifactId>jetty-ee9-servlet</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-annotations</artifactId>
+      <artifactId>jetty-ee</artifactId>
+      <version>${jetty-version}</version>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-jaas</artifactId>
+      <artifactId>jetty-security</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-session</artifactId>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
@@ -402,6 +427,56 @@
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-rewrite</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>jetty-websocket-core-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>jetty-websocket-core-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>jetty-websocket-core-server</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>jetty-websocket-jetty-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>jetty-websocket-jetty-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-jakarta-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-jetty-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-jetty-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-jetty-server</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.ee9.websocket</groupId>
+      <artifactId>jetty-ee9-websocket-servlet</artifactId>
+    </dependency>
+<!--
+o  'org.eclipse.jetty.websocket:websocket-core-common'
+o  'org.eclipse.jetty.websocket:websocket-core-server'
+o  'org.eclipse.jetty.websocket:websocket-jetty-api'
+o  'org.eclipse.jetty.websocket:websocket-jetty-common'
+o  'org.eclipse.jetty.websocket:websocket-jetty-server'
+o  'org.eclipse.jetty.websocket:websocket-servlet'
+o  'org.eclipse.jetty.orbit:javax.security.auth.message'
+o  'org.eclipse.jetty:apache-jsp'
+-->
     <dependency>
       <groupId>org.eclipse.jdt</groupId>
       <artifactId>ecj</artifactId>
@@ -446,8 +521,8 @@
     </dependency>
 
     <dependency>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>apache-jsp</artifactId>
+        <groupId>org.eclipse.jetty.ee9</groupId>
+        <artifactId>jetty-ee9-apache-jsp</artifactId>
     </dependency>
     <dependency>
         <groupId>org.eclipse.jetty</groupId>
diff --git a/assembly/src/main/descriptors/common-bin.xml 
b/assembly/src/main/descriptors/common-bin.xml
index 833e3f7dc6..00dec896b0 100644
--- a/assembly/src/main/descriptors/common-bin.xml
+++ b/assembly/src/main/descriptors/common-bin.xml
@@ -257,34 +257,42 @@
     <dependencySet>
       <outputDirectory>lib/web</outputDirectory>
       <unpack>false</unpack>
-      <scope>runtime</scope>
+      <!-- scope>runtime</scope -->
       <includes>
         <include>org.springframework:spring-web</include>
         <include>org.springframework:spring-webmvc</include>
-        <include>org.eclipse.jetty:jetty-annotations</include>
+        <include>org.eclipse.jetty:jetty-ee</include>
         <include>org.eclipse.jetty:jetty-server</include>
+        <include>org.eclipse.jetty:jetty-session</include>
         <include>org.eclipse.jetty:jetty-xml</include>
-        <include>org.eclipse.jetty:jetty-webapp</include>
         <include>org.eclipse.jetty:jetty-util</include>
         <include>org.eclipse.jetty:jetty-http</include>
         <include>org.eclipse.jetty:jetty-io</include>
-        <include>org.eclipse.jetty:jetty-jaas</include>
         <include>org.eclipse.jetty:jetty-jndi</include>
         <include>org.eclipse.jetty:jetty-plus</include>
-        <include>org.eclipse.jetty:jetty-servlet</include>
         <include>org.eclipse.jetty:jetty-security</include>
         <include>org.eclipse.jetty:jetty-rewrite</include>
+        <include>org.eclipse.jetty.ee9:jetty-ee9-nested</include>
+        <include>org.eclipse.jetty.ee9:jetty-ee9-security</include>
+        <include>org.eclipse.jetty.ee9:jetty-ee9-servlet</include>
+        <include>org.eclipse.jetty.ee9:jetty-ee9-webapp</include>
+        <include>org.eclipse.jetty.ee9:jetty-ee9-apache-jsp</include>
         
<include>org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api</include>
-        <include>org.eclipse.jetty.websocket:websocket-core-common</include>
-        <include>org.eclipse.jetty.websocket:websocket-core-server</include>
-        <include>org.eclipse.jetty.websocket:websocket-jetty-api</include>
+        
<include>org.eclipse.jetty.websocket:jetty-websocket-core-client</include>
+        
<include>org.eclipse.jetty.websocket:jetty-websocket-core-common</include>
+        
<include>org.eclipse.jetty.websocket:jetty-websocket-core-server</include>
+        
<include>org.eclipse.jetty.websocket:jetty-websocket-jetty-client</include>
+        
<include>org.eclipse.jetty.websocket:jetty-websocket-jetty-api</include>
         <include>org.eclipse.jetty.websocket:websocket-jetty-common</include>
         <include>org.eclipse.jetty.websocket:websocket-jetty-server</include>
-        <include>org.eclipse.jetty.websocket:websocket-servlet</include>
         <include>org.eclipse.jetty.orbit:javax.security.auth.message</include>
+        
<include>org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-client</include>
+        
<include>org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jetty-api</include>
+        
<include>org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jetty-common</include>
+        
<include>org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jetty-server</include>
+        
<include>org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-servlet</include>
         <!-- include>jakarta.servlet:jakarta.servlet-api</include -->
         <include>jakarta.websocket:jakarta.websocket-api</include>
-
         <!-- JSP support -->
         <!-- Jetty JSP api-->
         <include>org.eclipse.jetty:apache-jsp</include>
diff --git a/assembly/src/release/conf/jetty.xml 
b/assembly/src/release/conf/jetty.xml
index fdc922c688..e53489ef94 100644
--- a/assembly/src/release/conf/jetty.xml
+++ b/assembly/src/release/conf/jetty.xml
@@ -11,8 +11,7 @@
         implied. See the License for the specific language governing 
permissions and
         limitations under the License.
     -->
-    <!--
-        An embedded servlet engine for serving up the Admin consoles, REST and 
Ajax APIs and
+    <!-- An embedded servlet engine for serving up the Admin consoles, REST 
and Ajax APIs and
         some demos Include this file in your configuration to enable ActiveMQ 
web components
         e.g. <import resource="jetty.xml"/>
     -->
@@ -50,7 +49,7 @@
         -->
     </bean>
 
-    <bean id="jaasLoginService" 
class="org.eclipse.jetty.jaas.JAASLoginService">
+    <bean id="jaasLoginService" 
class="org.eclipse.jetty.security.jaas.JAASLoginService">
         <property name="name" value="ActiveMQRealm"/>
         <property name="loginModuleName" value="activemq"/>
         <property name="roleClassNames">
@@ -62,13 +61,13 @@
 
     <bean id="identityService" 
class="org.eclipse.jetty.security.DefaultIdentityService"/>
 
-    <bean id="securityConstraint" 
class="org.eclipse.jetty.util.security.Constraint">
+    <bean id="securityConstraint" 
class="org.eclipse.jetty.ee9.nested.ServletConstraint">
         <property name="name" value="BASIC" />
         <property name="roles" value="users,admins" />
         <!-- set authenticate=false to disable login -->
         <property name="authenticate" value="true" />
     </bean>
-    <bean id="adminSecurityConstraint" 
class="org.eclipse.jetty.util.security.Constraint">
+    <bean id="adminSecurityConstraint" 
class="org.eclipse.jetty.ee9.nested.ServletConstraint">
         <property name="name" value="BASIC" />
         <property name="roles" value="admins" />
          <!-- set authenticate=false to disable login -->
@@ -78,7 +77,7 @@
         Catch-all mapping: any request not matched by a more specific
         constraint below requires authentication as a user or admin.
     -->
-    <bean id="securityConstraintMapping" 
class="org.eclipse.jetty.security.ConstraintMapping">
+    <bean id="securityConstraintMapping" 
class="org.eclipse.jetty.ee9.security.ConstraintMapping">
         <property name="constraint" ref="securityConstraint" />
         <property name="pathSpec" value="/" />
     </bean>
@@ -87,7 +86,7 @@
         the full console UI, not just the *.action endpoints, so read-only
         pages (queue listings, message browsing, etc.) also require admin.
     -->
-    <bean id="adminSecurityConstraintMapping" 
class="org.eclipse.jetty.security.ConstraintMapping">
+    <bean id="adminSecurityConstraintMapping" 
class="org.eclipse.jetty.ee9.security.ConstraintMapping">
         <property name="constraint" ref="adminSecurityConstraint" />
         <property name="pathSpec" value="/admin/*" />
     </bean>
@@ -95,33 +94,33 @@
         Jolokia JMX bridge exposes broker management operations over HTTP;
         restrict to the admins role to prevent privilege escalation via JMX.
     -->
-    <bean id="jolokiaSecurityConstraintMapping" 
class="org.eclipse.jetty.security.ConstraintMapping">
+    <bean id="jolokiaSecurityConstraintMapping" 
class="org.eclipse.jetty.ee9.security.ConstraintMapping">
         <property name="constraint" ref="adminSecurityConstraint" />
         <property name="pathSpec" value="/api/jolokia/*" />
     </bean>
-    
+
     <bean id="rewriteHandler" 
class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
         <property name="rules">
             <list>
                 <bean id="header" 
class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                   <property name="pattern" value="*"/>
-                  <property name="name" value="X-FRAME-OPTIONS"/>
-                  <property name="value" value="SAMEORIGIN"/>
+                  <property name="headerName" value="X-FRAME-OPTIONS"/>
+                  <property name="headerValue" value="SAMEORIGIN"/>
                 </bean>
                 <bean id="header" 
class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                   <property name="pattern" value="*"/>
-                  <property name="name" value="X-XSS-Protection"/>
-                  <property name="value" value="1; mode=block"/>
+                  <property name="headerName" value="X-XSS-Protection"/>
+                  <property name="headerValue" value="1; mode=block"/>
                 </bean>
                 <bean id="header" 
class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                   <property name="pattern" value="*"/>
-                  <property name="name" value="X-Content-Type-Options"/>
-                  <property name="value" value="nosniff"/>
+                  <property name="headerName" value="X-Content-Type-Options"/>
+                  <property name="headerValue" value="nosniff"/>
                 </bean>
                 <bean id="header" 
class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                     <property name="pattern" value="*"/>
-                    <property name="name" value="Cache-Control"/>
-                    <property name="value" value="no-store"/>
+                    <property name="headerName" value="Cache-Control"/>
+                    <property name="headerValue" value="no-store"/>
                 </bean>
                 <bean id="header" 
class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                     <property name="pattern" value="*"/>
@@ -165,37 +164,37 @@
             </list>
         </property>
     </bean>
-    
-    <bean id="secHandlerCollection" 
class="org.eclipse.jetty.server.handler.HandlerCollection">
-        <property name="handlers">
+
+    <bean id="secHandlerCollection" 
class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
+        <constructor-arg>
             <list>
                 <ref bean="rewriteHandler"/>
-                <bean class="org.eclipse.jetty.webapp.WebAppContext">
+                <bean class="org.eclipse.jetty.ee9.webapp.WebAppContext">
                     <property name="contextPath" value="/admin" />
                     <property name="resourceBase" 
value="${activemq.home}/webapps/admin" />
                     <property name="logUrlOnStart" value="true" />
                 </bean>
-                <bean class="org.eclipse.jetty.webapp.WebAppContext">
+                <bean class="org.eclipse.jetty.ee9.webapp.WebAppContext">
                     <property name="contextPath" value="/api" />
                     <property name="resourceBase" 
value="${activemq.home}/webapps/api" />
                     <property name="logUrlOnStart" value="true" />
                 </bean>
                 <bean class="org.eclipse.jetty.server.handler.ResourceHandler">
-                    <property name="directoriesListed" value="false" />
+                    <property name="dirAllowed" value="false" />
                     <property name="welcomeFiles">
                         <list>
                             <value>index.html</value>
                         </list>
                     </property>
-                    <property name="resourceBase" 
value="${activemq.home}/webapps/" />
+                    <property name="baseResourceAsString" 
value="${activemq.home}/webapps/" />
                 </bean>
                 <bean id="defaultHandler" 
class="org.eclipse.jetty.server.handler.DefaultHandler">
-                    <property name="serveIcon" value="false" />
+                    <property name="serveFavIcon" value="false" />
                 </bean>
             </list>
-        </property>
+        </constructor-arg>
     </bean>    
-    <bean id="securityHandler" 
class="org.eclipse.jetty.security.ConstraintSecurityHandler">
+    <bean id="securityHandler" 
class="org.eclipse.jetty.ee9.security.ConstraintSecurityHandler">
         <property name="identityService" ref="identityService" />
         <property name="loginService" ref="jaasLoginService" />
         <property name="authenticator">
@@ -220,7 +219,7 @@
         <property name="port" value="8161"/>
     </bean>
 
-    <bean id="handlers" 
class="org.eclipse.jetty.server.handler.HandlerCollection">
+    <bean id="handlers" class="org.eclipse.jetty.server.Handler$Sequence">
         <property name="handlers">
             <list>
                 <ref bean="contexts" />
@@ -355,7 +354,7 @@
             </list>
         </property>
     </bean>
-    
+
     <bean id="invokeStart" 
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
         depends-on="broker, configureJetty, invokeConnectors, 
inetAccessIncludeLoopbackV6">
         <property name="targetObject" ref="Server" />
diff --git a/pom.xml b/pom.xml
index a00e607232..56414e2d6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -71,8 +71,8 @@
     <jakarta-jms-api-version>3.1.0</jakarta-jms-api-version>
     <jasypt-version>1.9.3</jasypt-version>
     <jaxb-version>4.0.9</jaxb-version>
-    <jetty-version>11.0.26</jetty-version>
-    <jetty-version-range>[11,13)</jetty-version-range>
+    <jetty-version>12.0.21</jetty-version>
+    <jetty-version-range>[12,13)</jetty-version-range>
     <jmdns-version>3.6.3</jmdns-version>
     <javassist-version>3.32.0-GA</javassist-version>
     <jettison-version>1.5.6</jettison-version>
@@ -830,6 +830,14 @@
         <scope>import</scope>
       </dependency>
 
+      <dependency>
+        <groupId>org.eclipse.jetty.ee9</groupId>
+        <artifactId>jetty-ee9-bom</artifactId>
+        <version>${jetty-version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+
       <dependency>
         <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to