diff --git a/dev-support/checkcompatibility.py b/dev-support/checkcompatibility.py index c03098a3a3a2..0eba1d53b5fa 100755 --- a/dev-support/checkcompatibility.py +++ b/dev-support/checkcompatibility.py @@ -44,6 +44,7 @@ import urllib.request import urllib.error import urllib.parse +import xml.etree.ElementTree as xml from collections import namedtuple try: import argparse @@ -135,7 +136,33 @@ def get_repo_name(remote_name="origin"): return remote[:-4] if remote.endswith(".git") else remote -def build_tree(java_path, verbose): +def select_java_home(java_path, java8_home, java17_home): + pom = xml.parse(os.path.join(java_path, "pom.xml")) + root = pom.getroot() + ns = "" + if root.tag.startswith("{"): + ns = root.tag.split("}")[0] + "}" # e.g. "{http://maven.apache.org/POM/4.0.0}" + version_elem = root.find(f"{ns}version") + if version_elem is not None and version_elem.text: + version = version_elem.text.strip() + else: + raise ValueError("Could not find project version") + if version == "${revision}": + properties_elem = root.find(f"{ns}properties") + if properties_elem is None: + raise ValueError("Could not find properties") + revision_elem = properties_elem.find(f"{ns}revision") + if revision_elem is not None and revision_elem.text: + version = revision_elem.text.strip() + else: + raise ValueError("Could not find project revision") + if version.startswith("3."): + return java17_home + else: + return java8_home + + +def build_tree(java_path, verbose, java8_home, java17_home): """ Run the Java build within 'path'. """ logging.info("Building in %s ", java_path) # special hack for comparing with rel/2.0.0, see HBASE-26063 for more details @@ -144,7 +171,10 @@ def build_tree(java_path, verbose): "-Dmaven.javadoc.skip=true", "--threads=1.0C", "package"] if not verbose: mvn_cmd.insert(-1, "--quiet") - subprocess.check_call(mvn_cmd, cwd=java_path) + env = os.environ.copy() + if java8_home and java17_home: + env["JAVA_HOME"] = select_java_home(java_path, java8_home, java17_home) + subprocess.check_call(mvn_cmd, cwd=java_path, env=env) def checkout_java_acc(force): @@ -444,6 +474,14 @@ def main(): parser.add_argument("--skip-build", action="store_true", help="Skip building the projects.") + parser.add_argument("--java8_home", + default=None, + help="Path to Java 8 installation. " + "Used for building projects with version < 3.0.") + parser.add_argument("--java17_home", + default=None, + help="Path to Java 17 installation. " + "Used for building projects with version >= 3.0.") parser.add_argument("--verbose", action="store_true", help="more output") @@ -516,8 +554,8 @@ def main(): if args.skip_build: logging.info("Skipping the build") else: - build_tree(src_dir, args.verbose) - build_tree(dst_dir, args.verbose) + build_tree(src_dir, args.verbose, args.java8_home, args.java17_home) + build_tree(dst_dir, args.verbose, args.java8_home, args.java17_home) # Find the JARs. src_jars = find_jars(src_dir) diff --git a/dev-support/create-release/release-build.sh b/dev-support/create-release/release-build.sh index 8fdf07eaba53..1b0b852d9bb6 100755 --- a/dev-support/create-release/release-build.sh +++ b/dev-support/create-release/release-build.sh @@ -101,7 +101,9 @@ fi init_locale init_java -#set java 17 for spotless +# always set java 8 for generating api report +set_java8_home +# set java 17 for spotless set_java17_home init_mvn init_python diff --git a/dev-support/create-release/release-util.sh b/dev-support/create-release/release-util.sh index 02020d93de01..e6921f39d8f9 100755 --- a/dev-support/create-release/release-util.sh +++ b/dev-support/create-release/release-util.sh @@ -609,6 +609,8 @@ function generate_api_report { org.apache.yetus.audience.InterfaceAudience.Public \ -e "original-hbase.*.jar" \ -e "hbase-shaded-testing-util.*.jar" \ + --java8_home "${JAVA8_HOME}" \ + --java17_home "${JAVA17_HOME}" \ "$previous_tag" "$release_tag" previous_version="$(echo "${previous_tag}" | sed -e 's/rel\///')" cp "${project}/target/compat-check/report.html" "./api_compare_${previous_version}_to_${release_tag}.html"