diff --git a/.gitignore b/.gitignore
index 8f1e942..f4b640b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@ hbase-shaded-protobuf/src/main/resources
.idea
*.iml
.flattened-pom.xml
+toolchains.xml
diff --git a/README.md b/README.md
index 1fa036d..ff026e5 100644
--- a/README.md
+++ b/README.md
@@ -86,20 +86,129 @@ In case build fails due to protobuf-java version change, we can follow below ste
---
-Note that this project requires JDK8. This is because a bunch of the code we
-have in hbase-unsafe is using old APIs that have been removed from more
-modern JDKs. Due to a bug in JDK, we cannot generate this code using a more
-modern version of the JDK. See
-[HBASE-26773](https://issues.apache.org/jira/browse/HBASE-26773) for details.
+## Dual JDK Requirements
+
+Starting with version 4.1.12, this project requires both JDK 8 and JDK 17 to accommodate different HBase versions:
+
+- **HBase 2.x**: Uses JDK 8 compatible modules (including `hbase-shaded-jetty` with Jetty 9)
+- **HBase 3.x**: Uses JDK 17 modules (including `hbase-shaded-jetty-12-plus-*` with Jetty 12)
+
+Jetty 12 requires JDK 17 for compilation, but HBase 2.x deployments cannot move to Jetty 12 for JDK 8 compatibility. Our solution provides a single release containing modules for both JDK versions, eliminating the need for separate branches or releases.
+
+### JDK 8 Required Modules
+
+This project has specific JDK requirements for different modules:
+
+- **hbase-unsafe**: Must be built with JDK 8 because it uses old APIs that have been removed from more modern JDKs. Due to a bug in JDK, we cannot generate this code using a more modern version of the JDK. See [HBASE-26773](https://issues.apache.org/jira/browse/HBASE-26773) for details.
+- **hbase-shaded-protobuf**: Must be built with JDK 8 because it depends on internal Java APIs such as `sun.misc.Unsafe`. These internal APIs are inaccessible when compiling with newer JDKs but release target set to JDK 8.
+
+### JDK 17 Compilation with JDK 8 Target
+
+**All other modules** (including Jetty 12 modules) use JDK 17 for compilation but with release target set to JDK 8.
+
+### Maven Enforcer Plugin Profiles
+
+The project uses Maven enforcer plugin profiles to ensure these requirements are met:
+- **enforce-jdk8-bytecode**: Ensures hbase-unsafe and hbase-shaded-protobuf are built with JDK 8.
+- **enforce-jdk17-bytecode**: For **Jetty 12 modules** (hbase-shaded-jetty-12-plus-*), the enforcer plugin allows JDK 17 bytecode to be included from Jetty 12 dependencies, while still using JDK 8 as the release target.
+
+### Why toolchains are required?
+
+Maven needs explicit toolchain configuration to automatically select JDK 8 for hbase-unsafe and hbase-shaded-protobuf modules, and JDK 17 for all other modules including Jetty 12 modules. Environment variables alone are insufficient.
+
+### Files
+- `dev-support/generate-toolchains.sh` - Script to generate toolchains.xml with configurable paths
+- `toolchains.xml` - Generated Maven toolchains configuration file (not checked in)
## Build/Deploy
-To build, make sure that your environment uses JDK8, then just run:
+### Local Development Setup
+
+1. **Install both JDK versions**: JDK 8 and JDK 17
+2. **Set environment variables**:
+ ```sh
+ export JAVA8_HOME=/path/to/your/jdk8
+ export JAVA17_HOME=/path/to/your/jdk17
+ ```
+3. **Choose your toolchain setup approach** (see options below)
+
+### Toolchain Setup Options
+
+**Option 1: Project-local toolchains.xml**
+```sh
+# Generate and use project-specific toolchains
+export JAVA8_HOME=/path/to/your/jdk8
+export JAVA17_HOME=/path/to/your/jdk17
+
+# Below command will generate toolchains.xml in project root
+./dev-support/generate-toolchains.sh
+
+# Run build by passing toolchains.xml file to maven
+mvn clean install -t toolchains.xml
+```
+**Option 2: Global Maven toolchains setup**
```sh
-mvn clean package
+# Setup toolchains in ~/.m2/ directory
+export JAVA8_HOME=/path/to/your/jdk8
+export JAVA17_HOME=/path/to/your/jdk17
+
+# Below command will generate toolchains.xml in project root
+./dev-support/generate-toolchains.sh
+
+# Copy the generated file to global .m2 directory
+cp toolchains.xml ~/.m2/toolchains.xml
+
+# Run build as usual
+mvn clean install
```
+### CI/Jenkins Setup
+
+The Jenkins CI environment uses a Docker-based build system that automatically handles the dual JDK requirements without any manual configuration.
+
+#### Multi-JDK Docker Environment
+
+The Jenkins build uses a custom Dockerfile (`dev-support/jenkins/Dockerfile`) that:
+- Downloads and installs both JDK 8 (Adoptium Temurin) and JDK 17 (Adoptium Temurin)
+- Places them at standardized paths:
+ - Java 8: `/usr/lib/jvm/java-8`
+ - Java 17: `/usr/lib/jvm/java-17`
+- Includes Maven 3.9.8 for the build process
+
+#### Maven Wrapper with Automatic Toolchains
+
+The Docker image creates a Maven wrapper that automatically handles toolchain configuration by replacing the original `mvn` command with a wrapper that always passes the `-t ${BASEDIR}/dev-support/toolchains-jenkins.xml` parameter to ensure the correct toolchains file is used for every Maven invocation.
+
+#### Automatic JDK Selection
+
+The system uses a pre-configured toolchains file (`dev-support/toolchains-jenkins.xml`) that:
+- Defines JDK 1.8 toolchain pointing to `/usr/lib/jvm/java-8`
+- Defines JDK 17 toolchain pointing to `/usr/lib/jvm/java-17`
+- Allows Maven to automatically select the correct JDK for each module based on the toolchain requirements in their POMs
+
+#### Jenkins Build Process
+
+In Jenkins, the build process is completely automated:
+1. Docker container starts with both JDKs pre-installed
+2. Maven wrapper automatically passes the toolchains configuration
+3. Each module uses the appropriate JDK version:
+ - `hbase-unsafe` and `hbase-shaded-protobuf`: Built with JDK 8
+ - All other modules: Built with JDK 17 (with JDK 8 release target)
+4. No manual toolchain setup or environment configuration required
+
+#### Environment Variables
+
+The Jenkinsfile sets the following environment variables:
+```bash
+SET_JAVA_HOME="/usr/lib/jvm/java-17" # Default JDK for the build
+JAVA8_HOME="/usr/lib/jvm/java-8" # JDK 8 location
+JAVA17_HOME="/usr/lib/jvm/java-17" # JDK 17 location
+```
+
+This automated setup ensures consistent builds across all Jenkins jobs without requiring developers or maintainers to manually configure toolchains in the CI environment.
+
+
## Release
To cut a release candidate, update JIRA. The hbase-thirdparty currently uses
diff --git a/dev-support/generate-toolchains.sh b/dev-support/generate-toolchains.sh
new file mode 100755
index 0000000..be764c1
--- /dev/null
+++ b/dev-support/generate-toolchains.sh
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Script to generate toolchains.xml with configurable Java paths
+
+# Set default paths if environment variables are not set
+if [ -z "$JAVA8_HOME" ]; then
+ echo "Trying to detect Java 8 installation (Jenkins/CI standard path)"
+ if [ -d "/usr/lib/jvm/java-8" ]; then
+ JAVA8_HOME="/usr/lib/jvm/java-8"
+ else
+ echo "Warning: JAVA8_HOME not set and Java 8 not found at /usr/lib/jvm/java-8"
+ echo "For local development, please set JAVA8_HOME environment variable"
+ JAVA8_HOME="/usr/lib/jvm/java-8"
+ fi
+fi
+
+if [ -z "$JAVA17_HOME" ]; then
+ echo "Trying to detect Java 17 installation (Jenkins/CI standard path)"
+ if [ -d "/usr/lib/jvm/java-17" ]; then
+ JAVA17_HOME="/usr/lib/jvm/java-17"
+ else
+ echo "Warning: JAVA17_HOME not set and Java 17 not found at /usr/lib/jvm/java-17"
+ echo "For local development, please set JAVA17_HOME environment variable"
+ JAVA17_HOME="/usr/lib/jvm/java-17"
+ fi
+fi
+
+TEMPLATE_FILE="./dev-support/toolchains-jenkins.xml"
+OUTPUT_FILE="toolchains.xml"
+
+if [ ! -f "$TEMPLATE_FILE" ]; then
+ echo "Template file $TEMPLATE_FILE not found!"
+ exit 1
+fi
+
+echo "Generating toolchains.xml with:"
+echo " JAVA8_HOME: $JAVA8_HOME"
+echo " JAVA17_HOME: $JAVA17_HOME"
+
+# Substitute placeholders and write output
+sed \
+ -e "s|/usr/lib/jvm/java-8|$JAVA8_HOME|g" \
+ -e "s|/usr/lib/jvm/java-17|$JAVA17_HOME|g" \
+ "$TEMPLATE_FILE" > "$OUTPUT_FILE"
+
+echo "toolchains.xml generated successfully!"
diff --git a/dev-support/jenkins/Dockerfile b/dev-support/jenkins/Dockerfile
index 9119a2b..5ebc37d 100644
--- a/dev-support/jenkins/Dockerfile
+++ b/dev-support/jenkins/Dockerfile
@@ -14,21 +14,112 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# Dockerfile for hbase-operator-tools pre-commit build.
-# https://builds.apache.org/job/PreCommit-HBASE-OPERATOR-TOOLS-Build
-
-FROM maven:3.9-eclipse-temurin-8
-
-# hadolint ignore=DL3008
-RUN apt-get -q update && apt-get -q install --no-install-recommends -y \
- binutils \
- git \
- rsync \
- shellcheck \
- patch \
- wget && \
+# Dockerfile for hbase-thirdparty pre-commit build.
+#
+#
+# Built in multiple stages so as to avoid re-downloading large binaries when
+# tweaking unrelated aspects of the image.
+FROM ubuntu:22.04 AS base_image
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
+
+RUN DEBIAN_FRONTEND=noninteractive apt-get -qq update && \
+ DEBIAN_FRONTEND=noninteractive apt-get -qq install --no-install-recommends -y \
+ ca-certificates=20211016 \
+ curl='7.81.0-*' \
+ locales='2.35-*' \
+ bash='5.1-*' \
+ binutils='2.38-*' \
+ build-essential=12.9ubuntu3 \
+ git='1:2.34.1-*' \
+ rsync='3.2.3-*' \
+ tar='1.34+dfsg-*' \
+ wget='1.21.2-*' \
+ shellcheck='0.8.0-*' \
+ patch='2.7.6-*' \
+ && \
apt-get clean && \
- rm -rf /var/lib/apt/lists/*
+ rm -rf /var/lib/apt/lists/* \
+ && \
+ locale-gen en_US.UTF-8
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
+
+##
+# download sundry dependencies
+#
+
+FROM base_image AS maven_download_image
+ENV MAVEN_VERSION='3.9.8'
+ENV MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
+ENV MAVEN_SHA512='7d171def9b85846bf757a2cec94b7529371068a0670df14682447224e57983528e97a6d1b850327e4ca02b139abaab7fcb93c4315119e6f0ffb3f0cbc0d0b9a2'
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
+RUN curl --location --fail --silent --show-error --output /tmp/maven.tar.gz "${MAVEN_URL}" && \
+ echo "${MAVEN_SHA512} */tmp/maven.tar.gz" | sha512sum -c -
+
+FROM base_image AS openjdk8_download_image
+ENV OPENJDK8_URL='https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u412-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz'
+ENV OPENJDK8_SHA256='b9884a96f78543276a6399c3eb8c2fd8a80e6b432ea50e87d3d12d495d1d2808'
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
+RUN curl --location --fail --silent --show-error --output /tmp/adoptopenjdk8.tar.gz "${OPENJDK8_URL}" && \
+ echo "${OPENJDK8_SHA256} */tmp/adoptopenjdk8.tar.gz" | sha256sum -c -
+
+FROM base_image AS openjdk17_download_image
+ENV OPENJDK17_URL='https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz'
+ENV OPENJDK17_SHA256='aa7fb6bb342319d227a838af5c363bfa1b4a670c209372f9e6585bd79da6220c'
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
+RUN curl --location --fail --silent --show-error --output /tmp/adoptopenjdk17.tar.gz "${OPENJDK17_URL}" && \
+ echo "${OPENJDK17_SHA256} */tmp/adoptopenjdk17.tar.gz" | sha256sum -c -
+
+##
+# build the final image
+#
+
+FROM base_image
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
+
+# hadolint ignore=DL3010
+COPY --from=maven_download_image /tmp/maven.tar.gz /tmp/maven.tar.gz
+RUN tar xzf /tmp/maven.tar.gz -C /opt && \
+ ln -s "/opt/$(dirname "$(tar -tf /tmp/maven.tar.gz | head -n1)")" /opt/maven && \
+ rm /tmp/maven.tar.gz
+
+##
+# ensure JVMs are available under `/usr/lib/jvm` and prefix each installation
+# as `java-` so as to conform with Yetus's assumptions.
+#
+
+# hadolint ignore=DL3010
+COPY --from=openjdk8_download_image /tmp/adoptopenjdk8.tar.gz /tmp/adoptopenjdk8.tar.gz
+RUN mkdir -p /usr/lib/jvm && \
+ tar xzf /tmp/adoptopenjdk8.tar.gz -C /usr/lib/jvm && \
+ ln -s "/usr/lib/jvm/$(basename "$(tar -tf /tmp/adoptopenjdk8.tar.gz | head -n1)")" /usr/lib/jvm/java-8-adoptopenjdk && \
+ ln -s /usr/lib/jvm/java-8-adoptopenjdk /usr/lib/jvm/java-8 && \
+ rm /tmp/adoptopenjdk8.tar.gz
+
+# hadolint ignore=DL3010
+COPY --from=openjdk17_download_image /tmp/adoptopenjdk17.tar.gz /tmp/adoptopenjdk17.tar.gz
+RUN mkdir -p /usr/lib/jvm && \
+ tar xzf /tmp/adoptopenjdk17.tar.gz -C /usr/lib/jvm && \
+ ln -s "/usr/lib/jvm/$(basename "$(tar -tf /tmp/adoptopenjdk17.tar.gz | head -n1)")" /usr/lib/jvm/java-17-adoptopenjdk && \
+ ln -s /usr/lib/jvm/java-17-adoptopenjdk /usr/lib/jvm/java-17 && \
+ rm /tmp/adoptopenjdk17.tar.gz
+
+# configure default environment for Yetus
+ENV MAVEN_HOME='/opt/maven'
+
+# create a wrapper for mvn to always pass the toolchains.xml file
+RUN mv /opt/maven/bin/mvn /opt/maven/bin/mvn-original && \
+ cat > /opt/maven/bin/mvn <<'EOF'
+#!/bin/bash
+TOOLCHAIN="${BASEDIR}/dev-support/toolchains-jenkins.xml"
+if [ -f "$TOOLCHAIN" ]; then
+ echo "Added: -t ${TOOLCHAIN} to mvn flags!"
+ exec ${MAVEN_HOME}/bin/mvn-original "$@" -t "$TOOLCHAIN"
+else
+ echo "Unexpected: ${TOOLCHAIN} file is missing!"
+ exec ${MAVEN_HOME}/bin/mvn-original "$@"
+fi
+EOF
+RUN chmod +x /opt/maven/bin/mvn && cat /opt/maven/bin/mvn
CMD ["/bin/bash"]
diff --git a/dev-support/jenkins/Jenkinsfile b/dev-support/jenkins/Jenkinsfile
index 00649d0..e6d9b97 100644
--- a/dev-support/jenkins/Jenkinsfile
+++ b/dev-support/jenkins/Jenkinsfile
@@ -53,7 +53,9 @@ pipeline {
DOCKERFILE_REL = "${SRC_REL}/dev-support/jenkins/Dockerfile"
YETUS_DRIVER_REL = "${SRC_REL}/dev-support/jenkins/jenkins_precommit_github_yetus.sh"
ARCHIVE_PATTERN_LIST = '*.dump'
- SET_JAVA_HOME = '/opt/java/openjdk'
+ SET_JAVA_HOME = "/usr/lib/jvm/java-17"
+ JAVA8_HOME = "/usr/lib/jvm/java-8"
+ JAVA17_HOME = "/usr/lib/jvm/java-17"
PLUGINS = 'all'
}
@@ -147,7 +149,7 @@ pipeline {
}
tools {
// this needs to be set to the jdk that ought to be used to build releases on the branch the Jenkinsfile is stored in.
- jdk "jdk_1.8_latest"
+ jdk "jdk_17_latest"
}
stages {
stage ('setup') {
diff --git a/dev-support/toolchains-jenkins.xml b/dev-support/toolchains-jenkins.xml
new file mode 100644
index 0000000..88bb0fe
--- /dev/null
+++ b/dev-support/toolchains-jenkins.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ jdk
+
+ 1.8
+
+
+ /usr/lib/jvm/java-8
+
+
+
+ jdk
+
+ 17
+
+
+ /usr/lib/jvm/java-17
+
+
+
diff --git a/hbase-shaded-jetty-12-plus-core/pom.xml b/hbase-shaded-jetty-12-plus-core/pom.xml
new file mode 100644
index 0000000..5756391
--- /dev/null
+++ b/hbase-shaded-jetty-12-plus-core/pom.xml
@@ -0,0 +1,228 @@
+
+
+
+ 4.0.0
+
+ org.apache.hbase.thirdparty
+ hbase-thirdparty
+ ${revision}
+ ..
+
+ hbase-shaded-jetty-12-plus-core
+ Apache HBase Relocated (Shaded) Jetty 12+ Libs: Core
+ Pulls down Jetty core, relocates it and makes a far jar.
+
+
+ true
+ false
+
+
+
+ org.eclipse.jetty
+ jetty-server
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-http
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-util
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-io
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-jmx
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-util-ajax
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-security
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-session
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-ee
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-xml
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+
+
+
+ maven-clean-plugin
+
+
+
+ ${basedir}
+
+ dependency-reduced-pom.xml
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+ shade
+
+ package
+
+ true
+ true
+
+
+ org.eclipse.jetty
+ ${rename.offset}.org.eclipse.jetty
+
+
+
+ -org.eclipse.jetty
+ -${rename.offset}.org.eclipse.jetty
+
+
+
+
+
+ org.slf4j:slf4j-api
+
+ org.apache.hbase.thirdparty:hbase-shaded-jetty-12-plus-core
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
diff --git a/hbase-shaded-jetty-12-plus-ee8/pom.xml b/hbase-shaded-jetty-12-plus-ee8/pom.xml
new file mode 100644
index 0000000..750ed72
--- /dev/null
+++ b/hbase-shaded-jetty-12-plus-ee8/pom.xml
@@ -0,0 +1,257 @@
+
+
+
+ 4.0.0
+
+ org.apache.hbase.thirdparty
+ hbase-thirdparty
+ ${revision}
+ ..
+
+ hbase-shaded-jetty-12-plus-ee8
+ Apache HBase Relocated (Shaded) Jetty 12+ Libs: EE8
+ Pulls down Jetty EE8, relocates it and makes a far jar.
+
+
+ true
+ false
+
+
+
+ org.eclipse.jetty.ee8
+ jetty-ee8-servlet
+ ${jetty-12-plus.version}
+
+
+ org.eclipse.jetty
+ servlet-api
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty.ee8
+ jetty-ee8-security
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty.ee8
+ jetty-ee8-nested
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.eclipse.jetty.ee8
+ jetty-ee8-webapp
+ ${jetty-12-plus.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+
+ org.eclipse.jetty
+ jetty-server
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-http
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-util
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-io
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-jmx
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-util-ajax
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-security
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-session
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-ee
+ ${jetty-12-plus.version}
+ provided
+
+
+ org.eclipse.jetty
+ jetty-xml
+ ${jetty-12-plus.version}
+ provided
+
+
+
+
+
+ maven-clean-plugin
+
+
+
+ ${basedir}
+
+ dependency-reduced-pom.xml
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+ shade
+
+ package
+
+ true
+ true
+
+
+ org.eclipse.jetty
+ ${rename.offset}.org.eclipse.jetty
+
+
+
+ -org.eclipse.jetty
+ -${rename.offset}.org.eclipse.jetty
+
+
+
+
+
+ org.slf4j:slf4j-api
+
+ org.apache.hbase.thirdparty:hbase-shaded-jetty-12-plus-ee8
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+
+ relocate-web-xml
+
+ run
+
+ package
+
+
+
+
+
+
+ org.eclipse.jetty
+ ${rename.offset}.org.eclipse.jetty
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hbase-shaded-protobuf/pom.xml b/hbase-shaded-protobuf/pom.xml
index 6ecbc35..89195df 100644
--- a/hbase-shaded-protobuf/pom.xml
+++ b/hbase-shaded-protobuf/pom.xml
@@ -29,6 +29,15 @@
hbase-shaded-protobuf
Apache HBase Patched and Relocated (Shaded) Protobuf
Pulls down protobuf, patches it, compiles, and then relocates/shades.
+
+
+ ${hbase.unsafe.and.protobuf.java.version}
+ ${java.release.version}
+ ${java.release.version}
+
diff --git a/hbase-unsafe/pom.xml b/hbase-unsafe/pom.xml
index 4781911..64d32aa 100644
--- a/hbase-unsafe/pom.xml
+++ b/hbase-unsafe/pom.xml
@@ -41,6 +41,12 @@
3.1.0
8.29
+
+ ${hbase.unsafe.and.protobuf.java.version}
+ ${java.release.version}
+ ${java.release.version}
+
+
diff --git a/pom.xml b/pom.xml
index 00962ab..d90b68a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,6 +100,8 @@
hbase-shaded-gson
hbase-shaded-miscellaneous
hbase-shaded-jetty
+ hbase-shaded-jetty-12-plus-core
+ hbase-shaded-jetty-12-plus-ee8
hbase-shaded-jersey
hbase-shaded-jackson-jaxrs-json-provider
hbase-noop-htrace
@@ -125,8 +127,17 @@
true
yyyy-MM-dd'T'HH:mm
${maven.build.timestamp}
- 1.8
- ${compileSource}
+
+ 1.8
+ 17
+ 8
+ ${java.release.version}
+
+ ${java.version}
+
+ false
+ true
+
3.3.3
1.7.1
org.apache.hbase.thirdparty
@@ -139,6 +150,7 @@
2.38.0
2.13.1
9.4.57.v20241219
+ 12.0.22
3.1.0
2.46
2.6.1
@@ -148,6 +160,27 @@
3.30.2-GA
2.19.0
2.30.0
+
+
+ -Dorg.apache.hbase.thirdparty.io.netty.tryReflectionSetAccessible=true
+ --add-modules jdk.unsupported
+ --add-opens java.base/java.io=ALL-UNNAMED
+ --add-opens java.base/java.nio=ALL-UNNAMED
+ --add-opens java.base/sun.nio.ch=ALL-UNNAMED
+ --add-opens java.base/java.lang=ALL-UNNAMED
+ --add-opens java.base/jdk.internal.ref=ALL-UNNAMED
+ --add-opens java.base/java.lang.reflect=ALL-UNNAMED
+ --add-opens java.base/java.util=ALL-UNNAMED
+ --add-opens java.base/java.util.concurrent=ALL-UNNAMED
+ --add-exports java.base/jdk.internal.misc=ALL-UNNAMED
+ --add-exports java.security.jgss/sun.security.krb5=ALL-UNNAMED
+ --add-exports java.base/sun.net.dns=ALL-UNNAMED
+ --add-exports java.base/sun.net.util=ALL-UNNAMED
+ --add-opens java.base/jdk.internal.util.random=ALL-UNNAMED
+ --add-opens java.base/sun.security.x509=ALL-UNNAMED
+ --add-opens java.base/sun.security.util=ALL-UNNAMED
+ --add-opens java.base/java.net=ALL-UNNAMED
+ ${hbase-surefire.jdk17.flags}
@@ -245,11 +278,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.11.0
-
- 1.8
- 1.8
-
+ 3.13.0
org.apache.maven.plugins
@@ -276,6 +305,11 @@
maven-enforcer-plugin
3.4.1
+
+ org.apache.maven.plugins
+ maven-toolchains-plugin
+ 3.2.0
+
org.codehaus.mojo
flatten-maven-plugin
@@ -297,6 +331,24 @@
+
+ org.apache.maven.plugins
+ maven-toolchains-plugin
+
+
+
+ ${toolchain.jdk.version}
+
+
+
+
+
+
+ toolchain
+
+
+
+
org.codehaus.mojo
build-helper-maven-plugin
@@ -346,9 +398,9 @@
- [${java.min.version},)
+ [${hbase.unsafe.and.protobuf.java.version},)
Java is out of date.
- HBase requires at least version ${java.min.version} of the JDK to properly build from source.
+ HBase requires at least version ${hbase.unsafe.and.protobuf.java.version} of the JDK to properly build from source.
See the reference guide on building for more information: http://hbase.apache.org/book.html#build
@@ -519,28 +571,65 @@
org.apache.maven.plugins
maven-enforcer-plugin
-
-
-
- ${compileSource}
-
- module-info
- **.glassfish.jersey.internal.jsr166.SubmissionPublisher*
- **.glassfish.jersey.internal.jsr166.JerseyFlowSubscriber*
-
- true
-
- test
-
- HBase has unsupported dependencies.
- HBase requires that all dependencies be compiled with version ${compileSource} or earlier
+
+
+
+ enforce-jdk8-bytecode
+
+ enforce
+
+ verify
+
+
+
+ ${hbase.unsafe.and.protobuf.java.version}
+
+ module-info
+ **.glassfish.jersey.internal.jsr166.SubmissionPublisher*
+ **.glassfish.jersey.internal.jsr166.JerseyFlowSubscriber*
+
+ true
+
+ test
+
+ HBase has unsupported dependencies.
+ hbase-unsafe requires to be compiled with version 1.8
of the JDK to properly build from source. You appear to be using a newer dependency. You can use
either "mvn -version" or "mvn enforcer:display-info" to verify what version is active.
Non-release builds can temporarily build with a newer JDK version by setting the
'compileSource' property (eg. mvn -DcompileSource=1.8 clean package).
-
-
-
+
+
+ ${skipJdk8BytecodeCheck}
+
+
+
+
+ enforce-jdk17-bytecode
+
+ enforce
+
+ verify
+
+
+
+ ${java.version}
+
+ module-info
+
+ true
+
+ test
+
+ Some modules require JDK 17 bytecode compatibility.
+ For example, Jetty 12 modules (hbase-shaded-jetty-12-plus-*) require dependencies compiled with JDK 17.
+ These modules are intended for HBase 3.x which supports JDK 17+.
+
+
+ ${skipJdk17BytecodeCheck}
+
+
+