This is an automated email from the ASF dual-hosted git repository.
anmolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push:
new 12d4cb474 ZOOKEEPER-5039: Raise to min JDK 17, also build, test with
JDK25
12d4cb474 is described below
commit 12d4cb474fb316b6dbc6fed766a1633acd7e9142
Author: Dávid Paksy <[email protected]>
AuthorDate: Wed Jun 24 21:24:08 2026 +0200
ZOOKEEPER-5039: Raise to min JDK 17, also build, test with JDK25
Reviewers: kgeisz, anmolnar, anmolnar, tamaashu
Author: PDavid
Closes #2376 from PDavid/ZOOKEEPER-5039-mockito-upgrade
---
.github/workflows/ci.yaml | 12 +--
.github/workflows/e2e.yaml | 4 +-
.github/workflows/manual.yaml | 4 +-
.github/workflows/website.yaml | 4 +-
Jenkinsfile | 2 +-
Jenkinsfile-PreCommit | 2 +-
README.md | 7 +-
dev/docker/Dockerfile | 5 +-
dev/docker/README.md | 3 +
excludeFindBugsFilter.xml | 18 +++++
pom.xml | 92 ++++++++++++++++------
.../PrometheusMetricsProviderConfigTest.java | 7 +-
zookeeper-server/pom.xml | 5 --
.../zookeeper/server/util/JvmPauseMonitor.java | 23 +++---
.../configuration-parameters.mdx | 6 +-
.../admin-ops/administrators-guide/deployment.mdx | 4 +-
16 files changed, 127 insertions(+), 71 deletions(-)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 6f09ab5c9..5d9bb1742 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -32,17 +32,17 @@ jobs:
strategy:
matrix:
profile:
- - name: 'full-build-jdk8'
- jdk: 8
+ - name: 'full-build-jdk17'
+ jdk: 17
args: '-Pfull-build apache-rat:check verify -DskipTests
spotbugs:check checkstyle:check'
- - name: 'full-build-jdk11'
- jdk: 11
+ - name: 'full-build-jdk25'
+ jdk: 25
args: '-Pfull-build apache-rat:check verify -DskipTests
spotbugs:check checkstyle:check'
- name: 'full-build-java-tests'
- jdk: 11
+ jdk: 25
args: '-Pfull-build verify -Dsurefire-forkcount=1 -DskipCppUnit
-Dsurefire.rerunFailingTestsCount=5'
- name: 'full-build-cppunit-tests'
- jdk: 11
+ jdk: 25
args: '-Pfull-build verify -Dtest=_ -DfailIfNoTests=false'
fail-fast: false
timeout-minutes: 360
diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml
index d20eba55b..d912c3929 100644
--- a/.github/workflows/e2e.yaml
+++ b/.github/workflows/e2e.yaml
@@ -25,8 +25,8 @@ jobs:
compatibility:
strategy:
matrix:
- jdk: [8, 11]
- zk: [3.5.9, 3.6.3, 3.7.0, nightly]
+ jdk: [17, 25]
+ zk: [3.7.2, 3.8.6, 3.9.5, nightly]
fail-fast: false
timeout-minutes: 360
runs-on: ubuntu-latest
diff --git a/.github/workflows/manual.yaml b/.github/workflows/manual.yaml
index 8b50b8be3..0c9d01565 100644
--- a/.github/workflows/manual.yaml
+++ b/.github/workflows/manual.yaml
@@ -46,10 +46,10 @@ jobs:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.inputs.buildRef }}
- - name: Set up JDK 11
+ - name: Set up JDK 17
uses: actions/setup-java@v5
with:
- java-version: 11
+ java-version: 17
distribution: temurin
cache: 'maven'
- name: Show the first log message
diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml
index c4a4a4566..a51101308 100644
--- a/.github/workflows/website.yaml
+++ b/.github/workflows/website.yaml
@@ -33,10 +33,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- - name: Set up JDK 11
+ - name: Set up JDK 25
uses: actions/setup-java@v5
with:
- java-version: 11
+ java-version: 25
distribution: temurin
cache: 'maven'
- name: Set up Node.js 22
diff --git a/Jenkinsfile b/Jenkinsfile
index 40fcdd5bb..5d2353364 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -39,7 +39,7 @@ pipeline {
axes {
axis {
name 'JAVA_VERSION'
- values 'jdk_1.8_latest', 'jdk_11_latest'
+ values 'jdk_17_latest', 'jdk_25_latest'
}
}
diff --git a/Jenkinsfile-PreCommit b/Jenkinsfile-PreCommit
index 8390e05b9..8c1143049 100644
--- a/Jenkinsfile-PreCommit
+++ b/Jenkinsfile-PreCommit
@@ -30,7 +30,7 @@ pipeline {
tools {
maven "maven_latest"
- jdk "jdk_1.8_latest"
+ jdk "jdk_17_latest"
}
stages {
diff --git a/README.md b/README.md
index cd9db2b46..6bc86742e 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
<p align="left">
<a href="https://zookeeper.apache.org/">
- <img src="https://zookeeper.apache.org/images/zookeeper_small.gif""
alt="https://zookeeper.apache.org/"><br/>
+ <img src="https://zookeeper.apache.org/images/zookeeper_small.gif"
alt="https://zookeeper.apache.org/"><br/>
</a>
</p>
@@ -39,11 +39,6 @@ is voted on and approved by the Apache ZooKeeper PMC:
https://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper
-## Java 8
-
-If you are going to compile with Java 1.8, you should use a
-recent release at u211 or above.
-
# Contributing
We always welcome new contributors to the project! See [How to
Contribute](https://cwiki.apache.org/confluence/display/ZOOKEEPER/HowToContribute)
for details on how to submit patches as pull requests and other aspects of our
contribution workflow.
diff --git a/dev/docker/Dockerfile b/dev/docker/Dockerfile
index 4d8a5d08d..8bccb05e8 100644
--- a/dev/docker/Dockerfile
+++ b/dev/docker/Dockerfile
@@ -17,7 +17,7 @@
# under the License.
#
-FROM maven:3.8.4-jdk-11
+FROM maven:3.8.8-eclipse-temurin-17
RUN apt-get update
RUN apt-get install -y \
@@ -31,4 +31,5 @@ RUN apt-get install -y \
libssl-dev \
libsasl2-modules-gssapi-mit \
libsasl2-modules \
- libsasl2-dev
+ libsasl2-dev \
+ gnupg
diff --git a/dev/docker/README.md b/dev/docker/README.md
new file mode 100644
index 000000000..02338da61
--- /dev/null
+++ b/dev/docker/README.md
@@ -0,0 +1,3 @@
+# About
+
+Just run `dev/docker/run.sh` and you will have a Linux environment with all
that is needed to build ZooKeeper, even on MacOs.
diff --git a/excludeFindBugsFilter.xml b/excludeFindBugsFilter.xml
index a29659448..573c76b2b 100644
--- a/excludeFindBugsFilter.xml
+++ b/excludeFindBugsFilter.xml
@@ -7,5 +7,23 @@
<!-- this problem is to be addressed in ZOOKEEPER-3227 -->
<Bug pattern="DM_DEFAULT_ENCODING"/>
+ <!-- newly detected by SpotBugs 4.9.3; pre-existing code, not regressions
-->
+ <Bug pattern="EI_EXPOSE_REP"/>
+ <Bug pattern="EI_EXPOSE_REP2"/>
+ <Bug pattern="CT_CONSTRUCTOR_THROW"/>
+ <Bug pattern="AT_STALE_THREAD_WRITE_OF_PRIMITIVE"/>
+ <Bug pattern="AT_NONATOMIC_64BIT_PRIMITIVE"/>
+ <Bug pattern="AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE"/>
+ <Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
+ <Bug pattern="DCN_NULLPOINTER_EXCEPTION"/>
+ <Bug pattern="US_USELESS_SUPPRESSION_ON_METHOD"/>
+ <Bug pattern="US_USELESS_SUPPRESSION_ON_CLASS"/>
+ <Bug pattern="US_USELESS_SUPPRESSION_ON_FIELD"/>
+ <Bug pattern="DMI_RANDOM_USED_ONLY_ONCE"/>
+ <Bug pattern="SS_SHOULD_BE_STATIC"/>
+ <Bug pattern="NP_UNWRITTEN_FIELD"/>
+ <Bug pattern="SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR"/>
+ <Bug pattern="MS_EXPOSE_REP"/>
+
</FindBugsFilter>
diff --git a/pom.xml b/pom.xml
index 2e14fe6ab..1aacd272b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -350,9 +350,6 @@
<name>m2e.version</name>
</property>
</activation>
- <properties>
- <maven.compiler.release>8</maven.compiler.release>
- </properties>
<build>
<pluginManagement>
<plugins>
@@ -436,15 +433,6 @@
</pluginManagement>
</build>
</profile>
- <profile>
- <id>jdk-release-flag</id>
- <activation>
- <jdk>[9,)</jdk>
- </activation>
- <properties>
- <maven.compiler.release>8</maven.compiler.release>
- </properties>
- </profile>
<profile>
<id>clover</id>
<activation>
@@ -540,8 +528,7 @@
<properties>
<!-- maven properties -->
- <maven.compiler.source>1.8</maven.compiler.source>
- <maven.compiler.target>1.8</maven.compiler.target>
+ <maven.compiler.release>17</maven.compiler.release>
<project.build.outputTimestamp>1691130453</project.build.outputTimestamp>
<dependency.locations.enabled>false</dependency.locations.enabled>
<surefire.version>2.22.1</surefire.version>
@@ -556,7 +543,7 @@
<jmockit.version>1.48</jmockit.version>
<junit.version>5.6.2</junit.version>
<junit-platform.version>1.6.2</junit-platform.version>
- <mockito.version>4.9.0</mockito.version>
+ <mockito.version>5.23.0</mockito.version>
<hamcrest.version>2.2</hamcrest.version>
<commons-cli.version>1.5.0</commons-cli.version>
<netty.version>4.1.130.Final</netty.version>
@@ -568,14 +555,16 @@
<bouncycastle.version>1.78</bouncycastle.version>
<commons-collections.version>4.4</commons-collections.version>
<dropwizard.version>4.1.12.1</dropwizard.version>
- <spotbugsannotations.version>4.0.2</spotbugsannotations.version>
+ <spotbugsannotations.version>4.9.3</spotbugsannotations.version>
<checkstyle.version>8.39</checkstyle.version>
<enforcer.version>3.0.0-M3</enforcer.version>
<commons-io.version>2.17.0</commons-io.version>
- <burningwave.mockdns.version>0.25.4</burningwave.mockdns.version>
+ <burningwave.mockdns.version>0.27.2</burningwave.mockdns.version>
<dnsjava.version>3.5.1</dnsjava.version>
<clover-maven-plugin.version>4.4.1</clover-maven-plugin.version>
<sonar-maven-plugin.version>3.7.0.1746</sonar-maven-plugin.version>
+ <maven.min.version>3.5.0</maven.min.version>
+ <java.min.version>${maven.compiler.release}</java.min.version>
<!-- parameters to pass to C client build -->
<c-client-openssl>yes</c-client-openssl>
@@ -704,12 +693,6 @@
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
</dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-inline</artifactId>
- <version>${mockito.version}</version>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-bom</artifactId>
@@ -887,10 +870,39 @@
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
- <version>4.0.0</version>
+ <version>4.9.3.0</version>
<configuration>
<excludeFilterFile>excludeFindBugsFilter.xml</excludeFilterFile>
</configuration>
+ <dependencies>
+ <!-- Override ASM version to support JDK 25 (class file version 69)
+ TODO: Remove this override when future SpotBugs version bundles
ASM 9.9+ -->
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm</artifactId>
+ <version>9.9.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-analysis</artifactId>
+ <version>9.9.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-commons</artifactId>
+ <version>9.9.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-tree</artifactId>
+ <version>9.9.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-util</artifactId>
+ <version>9.9.1</version>
+ </dependency>
+ </dependencies>
</plugin>
<plugin>
<groupId>org.owasp</groupId>
@@ -1157,6 +1169,38 @@
<artifactId>maven-enforcer-plugin</artifactId>
<version>${enforcer.version}</version>
<executions>
+ <execution>
+ <id>display-info</id>
+ <goals>
+ <goal>display-info</goal>
+ </goals>
+ <phase>initialize</phase>
+ <inherited>false</inherited>
+ </execution>
+ <execution>
+ <id>zookeeper-min-maven-min-java</id>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <rules>
+ <requireMavenVersion>
+ <version>[${maven.min.version},)</version>
+ <message>Maven is out of date.
+ ZooKeeper requires at least version ${maven.min.version}
of Maven to properly build from source.
+ You appear to be using an older version. You can use
either "mvn -version" or
+ "mvn enforcer:display-info" to verify what version is
active.</message>
+ </requireMavenVersion>
+ <requireJavaVersion>
+ <version>[${java.min.version},)</version>
+ <message>Java is out of date.
+ ZooKeeper requires at least version ${java.min.version} of
the JDK to properly build from source.
+ You appear to be using an older version. You can use
either "mvn -version" or
+ "mvn enforcer:display-info" to verify what version is
active.</message>
+ </requireJavaVersion>
+ </rules>
+ </configuration>
+ </execution>
<execution>
<id>banned-commons-lang</id>
<goals>
diff --git
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderConfigTest.java
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderConfigTest.java
index 66a01fb95..68cc26abd 100644
---
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderConfigTest.java
+++
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderConfigTest.java
@@ -21,6 +21,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyStore;
@@ -107,8 +108,10 @@ public void testInvalidAddr() throws
MetricsProviderLifeCycleException {
assertThrows(MetricsProviderLifeCycleException.class,
provider::start);
assertEquals("Failed to start Prometheus Jetty server",
exception.getMessage());
- assertNotNull(exception.getCause());
- assertEquals("Failed to bind to master:0",
exception.getCause().getMessage());
+ Throwable cause = exception.getCause();
+ assertNotNull(cause);
+ assertTrue(cause.getMessage().contains("Failed to bind to master"));
+ assertTrue(cause.getMessage().contains(":0"));
}
@Test
diff --git a/zookeeper-server/pom.xml b/zookeeper-server/pom.xml
index f4b76095d..1ad5afd34 100644
--- a/zookeeper-server/pom.xml
+++ b/zookeeper-server/pom.xml
@@ -145,11 +145,6 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-inline</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
diff --git
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/JvmPauseMonitor.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/JvmPauseMonitor.java
index 4a06f3db9..7e2fa9c3e 100644
---
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/JvmPauseMonitor.java
+++
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/util/JvmPauseMonitor.java
@@ -27,6 +27,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
import org.apache.zookeeper.server.ServerConfig;
import org.apache.zookeeper.server.ServerMetrics;
import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
@@ -64,9 +65,9 @@ public class JvmPauseMonitor {
public static final String INFO_THRESHOLD_KEY =
"jvm.pause.info-threshold.ms";
public static final long INFO_THRESHOLD_DEFAULT = 1000;
- private volatile long numGcWarnThresholdExceeded = 0;
- private volatile long numGcInfoThresholdExceeded = 0;
- private volatile long totalGcExtraSleepTime = 0;
+ private final AtomicLong numGcWarnThresholdExceeded = new AtomicLong(0);
+ private final AtomicLong numGcInfoThresholdExceeded = new AtomicLong(0);
+ private final AtomicLong totalGcExtraSleepTime = new AtomicLong(0);
private Thread monitorThread;
private volatile boolean shouldRun = true;
@@ -106,15 +107,15 @@ public boolean isStarted() {
}
public long getNumGcWarnThresholdExceeded() {
- return numGcWarnThresholdExceeded;
+ return numGcWarnThresholdExceeded.get();
}
public long getNumGcInfoThresholdExceeded() {
- return numGcInfoThresholdExceeded;
+ return numGcInfoThresholdExceeded.get();
}
public long getTotalGcExtraSleepTime() {
- return totalGcExtraSleepTime;
+ return totalGcExtraSleepTime.get();
}
private String formatMessage(long extraSleepTime, Map<String, GcTimes>
gcTimesAfterSleep, Map<String, GcTimes> gcTimesBeforeSleep) {
@@ -133,8 +134,8 @@ private String formatMessage(long extraSleepTime,
Map<String, GcTimes> gcTimesAf
String ret = String.format("Detected pause in JVM or host machine (eg
GC): pause of approximately %d ms, "
+ "total pause: info level: %d, warn level:
%d %n",
extraSleepTime,
- numGcInfoThresholdExceeded,
- numGcWarnThresholdExceeded);
+ numGcInfoThresholdExceeded.get(),
+ numGcWarnThresholdExceeded.get());
if (gcDiffs.isEmpty()) {
ret += ("No GCs detected");
} else {
@@ -197,13 +198,13 @@ public void run() {
}
Map<String, GcTimes> gcTimesAfterSleep = getGcTimes();
if (extraSleepTime > warnThresholdMs) {
- ++numGcWarnThresholdExceeded;
+ numGcWarnThresholdExceeded.incrementAndGet();
LOG.warn(formatMessage(extraSleepTime, gcTimesAfterSleep,
gcTimesBeforeSleep));
} else if (extraSleepTime > infoThresholdMs) {
- ++numGcInfoThresholdExceeded;
+ numGcInfoThresholdExceeded.incrementAndGet();
LOG.info(formatMessage(extraSleepTime, gcTimesAfterSleep,
gcTimesBeforeSleep));
}
- totalGcExtraSleepTime += extraSleepTime;
+ totalGcExtraSleepTime.addAndGet(extraSleepTime);
gcTimesBeforeSleep = gcTimesAfterSleep;
}
}
diff --git
a/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx
b/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx
index 93fcfdf8e..c493dc02a 100644
---
a/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx
+++
b/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx
@@ -1390,11 +1390,7 @@ server if this feature is enabled with sasl as
authentication scheme.
## TLS Cipher Suites
From 3.5.5 to 3.9 a hard coded default cipher list was used, with the ordering
-dependent on whether it is run Java 8 or a later version.
-
-The list on Java 8 includes TLSv1.2 CBC, GCM and TLSv1.3 ciphers in ordering:
_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_ [...]
-
-The list on Java 9+ includes TLSv1.2 GCM, CBC and TLSv1.3 ciphers in ordering:
_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WI [...]
+dependent on whether it was run Java 8 or a later version.
Since 3.10 there is no hardcoded list, and the JDK defaults are used.
diff --git
a/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/deployment.mdx
b/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/deployment.mdx
index 7bd2e9ea0..a37e895dc 100644
---
a/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/deployment.mdx
+++
b/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/deployment.mdx
@@ -54,8 +54,8 @@ is no full support.
### Required Software
-ZooKeeper runs in Java, release 1.8 or greater
-(JDK 8 LTS, JDK 11 LTS, JDK 12 - Java 9 and 10 are not supported).
+ZooKeeper runs in Java, release 17 or greater
+(JDK 17 LTS, JDK 21 LTS, JDK 25 LTS - other Java versions are not supported).
It runs as an _ensemble_ of ZooKeeper servers. Three
ZooKeeper servers is the minimum recommended size for an
ensemble, and we also recommend that they run on separate