diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 22e9f6b2b..b68fa8483 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -36,10 +36,6 @@ updates:
- RELEASE802
- RELEASE81
- RELEASE82
- # [JENKINS-68698] Must remain within Jetty 10.x until the Jakarta EE 9
- # migration is complete
- - dependency-name: "org.eclipse.jetty:jetty-bom"
- versions: [">=11.0.0"]
# FIPS mismatches
- dependency-name: org.jenkins-ci.modules:instance-identity
- package-ecosystem: github-actions
diff --git a/Jenkinsfile b/Jenkinsfile
index ba75acfd8..07027e873 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -4,7 +4,7 @@
* allowing one to test against multiple Jenkins versions.
*/
buildPlugin(useContainerAgent: true, configurations: [
- [platform: 'linux', jdk: 11],
- [platform: 'windows', jdk: 11],
- [platform: 'linux', jdk: 17, jenkins: '2.462'],
+ [platform: 'linux', jdk: 17],
+ [platform: 'windows', jdk: 17],
+ [platform: 'linux', jdk: 21, jenkins: '2.462']
])
diff --git a/pom.xml b/pom.xml
index 8ab406d8f..b018aede0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,8 +61,7 @@ THE SOFTWARE.
jenkinsci/${project.artifactId}
--patch-module=java.base=${project.build.outputDirectory}/netbeans/harness/modules/ext/org-netbeans-insane-hook.jar --add-exports=java.base/org.netbeans.insane.hook=ALL-UNNAMED
-
- 11
+ 12.0.10
@@ -70,7 +69,14 @@ THE SOFTWARE.
org.eclipse.jetty
jetty-bom
- 10.0.21
+ ${jetty.version}
+ pom
+ import
+
+
+ org.eclipse.jetty.ee8
+ jetty-ee8-bom
+ ${jetty.version}
pom
import
@@ -120,8 +126,8 @@ THE SOFTWARE.
- org.eclipse.jetty
- jetty-webapp
+ org.eclipse.jetty.ee8
+ jetty-ee8-webapp
@@ -131,11 +137,15 @@ THE SOFTWARE.
- org.eclipse.jetty.websocket
-
- websocket-jetty-server
+ org.eclipse.jetty.ee8.websocket
+ jetty-ee8-websocket-jetty-server
+
+
+ jakarta.annotation
+ jakarta.annotation-api
+
org.slf4j
slf4j-api
diff --git a/src/main/java/jenkins/benchmark/jmh/JmhBenchmarkState.java b/src/main/java/jenkins/benchmark/jmh/JmhBenchmarkState.java
index 8e90c078d..8ba0f8173 100644
--- a/src/main/java/jenkins/benchmark/jmh/JmhBenchmarkState.java
+++ b/src/main/java/jenkins/benchmark/jmh/JmhBenchmarkState.java
@@ -14,8 +14,8 @@
import javax.servlet.ServletContext;
import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration;
+import org.eclipse.jetty.ee8.webapp.WebAppContext;
import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.webapp.WebAppContext;
import org.jvnet.hudson.test.JavaNetReverseProxy;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TemporaryDirectoryAllocator;
diff --git a/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java b/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java
index 416cb0cd8..ff5145725 100644
--- a/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java
+++ b/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java
@@ -139,6 +139,10 @@
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.apache.commons.beanutils.PropertyUtils;
+import org.eclipse.jetty.ee8.webapp.Configuration;
+import org.eclipse.jetty.ee8.webapp.WebAppContext;
+import org.eclipse.jetty.ee8.webapp.WebXmlConfiguration;
+import org.eclipse.jetty.ee8.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.eclipse.jetty.http.HttpCompliance;
import org.eclipse.jetty.http.UriCompliance;
import org.eclipse.jetty.security.HashLoginService;
@@ -150,10 +154,6 @@
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.security.Password;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.webapp.Configuration;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.webapp.WebXmlConfiguration;
-import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.htmlunit.AjaxController;
import org.htmlunit.AlertHandler;
import org.htmlunit.BrowserVersion;
@@ -550,7 +550,13 @@ protected ServletContext createWebServer() throws Exception {
server = new Server(qtp);
explodedWarDir = WarExploder.getExplodedDir();
- WebAppContext context = new WebAppContext(explodedWarDir.getPath(), contextPath);
+ WebAppContext context = new WebAppContext(explodedWarDir.getPath(), contextPath) {
+ @Override
+ protected ClassLoader configureClassLoader(ClassLoader loader) {
+ // Use flat classpath in tests
+ return loader;
+ }
+ };
context.setResourceBase(explodedWarDir.getPath());
context.setClassLoader(getClass().getClassLoader());
context.setConfigurations(new Configuration[]{new WebXmlConfiguration()});
diff --git a/src/main/java/org/jvnet/hudson/test/JavaNetReverseProxy.java b/src/main/java/org/jvnet/hudson/test/JavaNetReverseProxy.java
index f59484e0a..ceab85e34 100644
--- a/src/main/java/org/jvnet/hudson/test/JavaNetReverseProxy.java
+++ b/src/main/java/org/jvnet/hudson/test/JavaNetReverseProxy.java
@@ -10,11 +10,11 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
+import org.eclipse.jetty.ee8.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee8.servlet.ServletHolder;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
/**
diff --git a/src/main/java/org/jvnet/hudson/test/JenkinsRule.java b/src/main/java/org/jvnet/hudson/test/JenkinsRule.java
index 59a035384..50b587ca8 100644
--- a/src/main/java/org/jvnet/hudson/test/JenkinsRule.java
+++ b/src/main/java/org/jvnet/hudson/test/JenkinsRule.java
@@ -174,6 +174,10 @@
import net.sf.json.JSONObject;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.io.FileUtils;
+import org.eclipse.jetty.ee8.webapp.Configuration;
+import org.eclipse.jetty.ee8.webapp.WebAppContext;
+import org.eclipse.jetty.ee8.webapp.WebXmlConfiguration;
+import org.eclipse.jetty.ee8.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.eclipse.jetty.http.HttpCompliance;
import org.eclipse.jetty.http.UriCompliance;
import org.eclipse.jetty.security.HashLoginService;
@@ -185,10 +189,6 @@
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.security.Password;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.webapp.Configuration;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.webapp.WebXmlConfiguration;
-import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.htmlunit.AjaxController;
import org.htmlunit.BrowserVersion;
import org.htmlunit.DefaultCssErrorHandler;
@@ -855,7 +855,13 @@ public static WebAppContext _createWebAppContext(
qtp.setName("Jetty (JenkinsRule)");
Server server = new Server(qtp);
- WebAppContext context = new WebAppContext(WarExploder.getExplodedDir().getPath(), contextPath);
+ WebAppContext context = new WebAppContext(WarExploder.getExplodedDir().getPath(), contextPath) {
+ @Override
+ protected ClassLoader configureClassLoader(ClassLoader loader) {
+ // Use flat classpath in tests
+ return loader;
+ }
+ };
context.setClassLoader(classLoader);
context.setConfigurations(new Configuration[]{new WebXmlConfiguration()});
context.addBean(new NoListenerConfiguration(context));
diff --git a/src/main/java/org/jvnet/hudson/test/NoListenerConfiguration.java b/src/main/java/org/jvnet/hudson/test/NoListenerConfiguration.java
index dee8de59b..2b6f7c9d3 100644
--- a/src/main/java/org/jvnet/hudson/test/NoListenerConfiguration.java
+++ b/src/main/java/org/jvnet/hudson/test/NoListenerConfiguration.java
@@ -26,8 +26,8 @@
import hudson.WebAppMain;
import java.util.EventListener;
import javax.servlet.ServletContextListener;
+import org.eclipse.jetty.ee8.webapp.WebAppContext;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.eclipse.jetty.webapp.WebAppContext;
/**
* Kills off the {@link WebAppMain} {@link ServletContextListener}.