Skip to content

Commit 28c9be7

Browse files
committed
ZOOKEEPER-5038 Decouple HTTP admin server into a separate module
Extract JettyAdminServer into a new zookeeper-http-admin module that targets Java 17 and Jetty 12 (EE8). This decouples the Jetty upgrade from the ZooKeeper Java baseline, allowing the rest of ZooKeeper to remain on Java 8/11. The existing reflection-based loading in AdminServerFactory means zookeeper-server requires no interface changes. On Java 8/11, the admin server gracefully falls back to DummyAdminServer with a clear warning about the Java 17 requirement. Breaking change: the HTTP admin server now requires Java 17+.
1 parent 34a9492 commit 28c9be7

27 files changed

Lines changed: 4688 additions & 28 deletions

checkstyleSuppressions.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525

2626
<!-- TODO ZOOKEEPER-3508 -->
2727
<suppress checks="LineLength" files=".+[\\/]zookeeper-server[\\/].+\.java"/>
28+
<suppress checks="LineLength" files=".+[\\/]zookeeper-server-http-admin[\\/].+\.java"/>
2829

2930
<!-- TODO ZOOKEEPER-3507 -->
3031
<suppress checks=".*Name.*" files=".+[\\/]zookeeper-server[\\/].+\.java"/>
32+
<suppress checks=".*Name.*" files=".+[\\/]zookeeper-server-http-admin[\\/].+\.java"/>
3133

3234
<!-- TODO ZOOKEEPER-3469 -->
3335
<suppress checks="Javadoc.+" files=".+[\\/]zookeeper-server[\\/].+\.java"/>
36+
<suppress checks="Javadoc.+" files=".+[\\/]zookeeper-server-http-admin[\\/].+\.java"/>
3437
</suppressions>

pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,15 @@
286286
</developers>
287287

288288
<profiles>
289+
<profile>
290+
<id>jdk17+</id>
291+
<activation>
292+
<jdk>[17,)</jdk>
293+
</activation>
294+
<modules>
295+
<module>zookeeper-server-http-admin</module>
296+
</modules>
297+
</profile>
289298
<profile>
290299
<id>full-build</id>
291300
<modules>

zookeeper-assembly/pom.xml

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,19 @@
3838
<skip.lib.artifact>false</skip.lib.artifact>
3939
</properties>
4040
</profile>
41+
<profile>
42+
<id>jdk17+</id>
43+
<activation>
44+
<jdk>[17,)</jdk>
45+
</activation>
46+
<dependencies>
47+
<dependency>
48+
<groupId>org.apache.zookeeper</groupId>
49+
<artifactId>zookeeper-http-admin</artifactId>
50+
<version>${project.version}</version>
51+
</dependency>
52+
</dependencies>
53+
</profile>
4154
</profiles>
4255

4356

@@ -87,14 +100,6 @@
87100
<groupId>commons-cli</groupId>
88101
<artifactId>commons-cli</artifactId>
89102
</dependency>
90-
<dependency>
91-
<groupId>org.eclipse.jetty</groupId>
92-
<artifactId>jetty-server</artifactId>
93-
</dependency>
94-
<dependency>
95-
<groupId>org.eclipse.jetty</groupId>
96-
<artifactId>jetty-servlet</artifactId>
97-
</dependency>
98103
<dependency>
99104
<groupId>com.fasterxml.jackson.core</groupId>
100105
<artifactId>jackson-databind</artifactId>
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<!--
4+
/**
5+
* Licensed to the Apache Software Foundation (ASF) under one
6+
* or more contributor license agreements. See the NOTICE file
7+
* distributed with this work for additional information
8+
* regarding copyright ownership. The ASF licenses this file
9+
* to you under the Apache License, Version 2.0 (the
10+
* "License"); you may not use this file except in compliance
11+
* with the License. You may obtain a copy of the License at
12+
*
13+
* http://www.apache.org/licenses/LICENSE-2.0
14+
*
15+
* Unless required by applicable law or agreed to in writing, software
16+
* distributed under the License is distributed on an "AS IS" BASIS,
17+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
* See the License for the specific language governing permissions and
19+
* limitations under the License.
20+
*/
21+
-->
22+
<modelVersion>4.0.0</modelVersion>
23+
<parent>
24+
<groupId>org.apache.zookeeper</groupId>
25+
<artifactId>parent</artifactId>
26+
<version>3.10.0-SNAPSHOT</version>
27+
</parent>
28+
29+
<artifactId>zookeeper-http-admin</artifactId>
30+
<packaging>jar</packaging>
31+
<name>Apache ZooKeeper - HTTP Admin Server</name>
32+
<description>
33+
Optional HTTP admin server for ZooKeeper, backed by Jetty 12.
34+
Requires Java 17 or later. When this module is on the classpath,
35+
ZooKeeper will automatically use JettyAdminServer; otherwise it
36+
falls back to DummyAdminServer.
37+
</description>
38+
39+
<properties>
40+
<maven.compiler.release>17</maven.compiler.release>
41+
<jetty12.version>12.0.35</jetty12.version>
42+
</properties>
43+
44+
<dependencies>
45+
<dependency>
46+
<groupId>org.apache.zookeeper</groupId>
47+
<artifactId>zookeeper</artifactId>
48+
<version>${project.version}</version>
49+
</dependency>
50+
51+
<!-- Jetty 12 core -->
52+
<dependency>
53+
<groupId>org.eclipse.jetty</groupId>
54+
<artifactId>jetty-server</artifactId>
55+
<version>${jetty12.version}</version>
56+
</dependency>
57+
58+
<!-- Jetty 12 EE8 (javax.servlet compatibility) -->
59+
<dependency>
60+
<groupId>org.eclipse.jetty.ee8</groupId>
61+
<artifactId>jetty-ee8-servlet</artifactId>
62+
<version>${jetty12.version}</version>
63+
</dependency>
64+
<dependency>
65+
<groupId>org.eclipse.jetty.ee8</groupId>
66+
<artifactId>jetty-ee8-security</artifactId>
67+
<version>${jetty12.version}</version>
68+
</dependency>
69+
70+
<!-- Logging -->
71+
<dependency>
72+
<groupId>org.slf4j</groupId>
73+
<artifactId>slf4j-api</artifactId>
74+
</dependency>
75+
76+
<!-- Test dependencies -->
77+
<dependency>
78+
<groupId>org.apache.zookeeper</groupId>
79+
<artifactId>zookeeper</artifactId>
80+
<version>${project.version}</version>
81+
<type>test-jar</type>
82+
<scope>test</scope>
83+
</dependency>
84+
<dependency>
85+
<groupId>org.eclipse.jetty</groupId>
86+
<artifactId>jetty-client</artifactId>
87+
<version>${jetty12.version}</version>
88+
<scope>test</scope>
89+
</dependency>
90+
<dependency>
91+
<groupId>org.junit.jupiter</groupId>
92+
<artifactId>junit-jupiter-api</artifactId>
93+
<scope>test</scope>
94+
</dependency>
95+
<dependency>
96+
<groupId>org.junit.jupiter</groupId>
97+
<artifactId>junit-jupiter-engine</artifactId>
98+
<scope>test</scope>
99+
</dependency>
100+
<dependency>
101+
<groupId>ch.qos.logback</groupId>
102+
<artifactId>logback-classic</artifactId>
103+
<scope>test</scope>
104+
</dependency>
105+
<dependency>
106+
<groupId>org.bouncycastle</groupId>
107+
<artifactId>bcprov-jdk18on</artifactId>
108+
<scope>test</scope>
109+
</dependency>
110+
<dependency>
111+
<groupId>org.bouncycastle</groupId>
112+
<artifactId>bcpkix-jdk18on</artifactId>
113+
<scope>test</scope>
114+
</dependency>
115+
</dependencies>
116+
117+
</project>

zookeeper-server/src/main/java/org/apache/zookeeper/server/admin/JettyAdminServer.java renamed to zookeeper-server-http-admin/src/main/java/org/apache/zookeeper/server/admin/JettyAdminServer.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,21 @@
3333
import org.apache.zookeeper.common.SecretUtils;
3434
import org.apache.zookeeper.common.X509Util;
3535
import org.apache.zookeeper.server.ZooKeeperServer;
36+
import org.apache.zookeeper.server.admin.jetty.UnifiedConnectionFactory;
3637
import org.apache.zookeeper.server.auth.IPAuthenticationProvider;
38+
import org.eclipse.jetty.ee8.nested.ServletConstraint;
39+
import org.eclipse.jetty.ee8.security.ConstraintMapping;
40+
import org.eclipse.jetty.ee8.security.ConstraintSecurityHandler;
41+
import org.eclipse.jetty.ee8.servlet.ServletContextHandler;
42+
import org.eclipse.jetty.ee8.servlet.ServletHolder;
3743
import org.eclipse.jetty.http.HttpHeader;
3844
import org.eclipse.jetty.http.HttpVersion;
39-
import org.eclipse.jetty.security.ConstraintMapping;
40-
import org.eclipse.jetty.security.ConstraintSecurityHandler;
4145
import org.eclipse.jetty.server.HttpConfiguration;
4246
import org.eclipse.jetty.server.HttpConnectionFactory;
4347
import org.eclipse.jetty.server.SecureRequestCustomizer;
4448
import org.eclipse.jetty.server.Server;
4549
import org.eclipse.jetty.server.ServerConnector;
4650
import org.eclipse.jetty.server.SslConnectionFactory;
47-
import org.eclipse.jetty.servlet.ServletContextHandler;
48-
import org.eclipse.jetty.servlet.ServletHolder;
49-
import org.eclipse.jetty.util.security.Constraint;
5051
import org.eclipse.jetty.util.ssl.SslContextFactory;
5152
import org.slf4j.Logger;
5253
import org.slf4j.LoggerFactory;
@@ -369,7 +370,7 @@ private List<String> commandLinks() {
369370
* @param ctxHandler the context to modify
370371
*/
371372
private void constrainTraceMethod(ServletContextHandler ctxHandler) {
372-
Constraint c = new Constraint();
373+
ServletConstraint c = new ServletConstraint();
373374
c.setAuthenticate(true);
374375

375376
ConstraintMapping cmt = new ConstraintMapping();

0 commit comments

Comments
 (0)