From f010df9fe6de12113a099e9a42230015d5ba7175 Mon Sep 17 00:00:00 2001 From: Matt L <124107509+mattjala@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:15:10 -0500 Subject: [PATCH] Make JAR dep paths modifiable (#6331) --- CMakeInstallation.cmake | 6 +++--- CMakeLists.txt | 8 +++++--- docs/INSTALL_CMake_options.md | 5 +++++ java/CMakeLists.txt | 35 ++++++++++++++++++++++++++++++++ java/jtest/CMakeLists.txt | 4 ++-- java/src-jni/test/CMakeLists.txt | 2 +- java/test/CMakeLists.txt | 2 +- release_docs/CHANGELOG.md | 8 +++++++- 8 files changed, 59 insertions(+), 11 deletions(-) diff --git a/CMakeInstallation.cmake b/CMakeInstallation.cmake index 69118d0730b..4f424ca39ce 100644 --- a/CMakeInstallation.cmake +++ b/CMakeInstallation.cmake @@ -112,9 +112,9 @@ if (HDF5_BUILD_JAVA) set (HDF5_JARHDF5_JAR_NAME "jarhdf5-${HDF5_PACKAGE_VERSION}.jar") set (HDF5_JAVAHDF5_JAR_NAME "javahdf5-${HDF5_PACKAGE_VERSION}.jar") endif () - # slf4j JAR names (these are dependencies, version shouldn't change with SNAPSHOT) - set (HDF5_SLF4J_API_JAR_NAME "slf4j-api-2.0.16.jar") - set (HDF5_SLF4J_NOP_JAR_NAME "slf4j-nop-2.0.16.jar") + # slf4j JAR names derived from configured paths so overrides are reflected in the exported config + get_filename_component (HDF5_SLF4J_API_JAR_NAME ${HDF5_JAVA_LOGGING_JAR} NAME) + get_filename_component (HDF5_SLF4J_NOP_JAR_NAME ${HDF5_JAVA_LOGGING_NOP_JAR} NAME) endif () #----------------------------------------------------------------------------- diff --git a/CMakeLists.txt b/CMakeLists.txt index 569958cc331..79ed42d5a9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -325,9 +325,11 @@ set (HDF5_JAVA_SRCJNI_PATH ${HDF5_SOURCE_DIR}/java/src-jni) set (HDF5_JAVA_SRCJNI_JNI_SRC_DIR ${HDF5_SOURCE_DIR}/java/src-jni/jni) set (HDF5_JAVA_LIB_DIR ${HDF5_SOURCE_DIR}/java/lib) set (HDF5_JAVA_JSRC_DIR ${HDF5_SOURCE_DIR}/java/jsrc) -set (HDF5_JAVA_LOGGING_JAR ${HDF5_SOURCE_DIR}/java/lib/slf4j-api-2.0.16.jar) -set (HDF5_JAVA_LOGGING_NOP_JAR ${HDF5_SOURCE_DIR}/java/lib/ext/slf4j-nop-2.0.16.jar) -set (HDF5_JAVA_LOGGING_SIMPLE_JAR ${HDF5_SOURCE_DIR}/java/lib/ext/slf4j-simple-2.0.16.jar) +set (HDF5_JAVA_LOGGING_JAR ${HDF5_SOURCE_DIR}/java/lib/slf4j-api-2.0.16.jar CACHE FILEPATH "Path to SLF4J API jar") +set (HDF5_JAVA_LOGGING_NOP_JAR ${HDF5_SOURCE_DIR}/java/lib/ext/slf4j-nop-2.0.16.jar CACHE FILEPATH "Path to SLF4J NOP binding jar") +set (HDF5_JAVA_LOGGING_SIMPLE_JAR ${HDF5_SOURCE_DIR}/java/lib/ext/slf4j-simple-2.0.16.jar CACHE FILEPATH "Path to SLF4J simple binding jar") +set (HDF5_JAVA_JUNIT_JAR ${HDF5_JAVA_LIB_DIR}/org.junit.jar CACHE FILEPATH "Path to JUnit jar") +set (HDF5_JAVA_HAMCREST_JAR ${HDF5_JAVA_LIB_DIR}/org.hamcrest.jar CACHE FILEPATH "Path to Hamcrest jar") set (HDF5_DOCS_DIR ${HDF5_SOURCE_DIR}/docs) set (HDF5_DOXYGEN_DIR ${HDF5_DOCS_DIR}/doxygen) diff --git a/docs/INSTALL_CMake_options.md b/docs/INSTALL_CMake_options.md index 6df222a364f..b4af17a38ba 100644 --- a/docs/INSTALL_CMake_options.md +++ b/docs/INSTALL_CMake_options.md @@ -166,6 +166,11 @@ These are options which are specific to HDF5's wrappers for programming language | `HDF5_JAVA_PACK_JRE` | `BOOL` | `OFF` | If `ON`, packages a Java JRE with an HDF5 installation. | | `HDF5_ENABLE_MAVEN_DEPLOY` | `BOOL` | `OFF` | If `ON`, enables Maven repository deployment support. | | `HDF5_MAVEN_SNAPSHOT` | `BOOL` | `OFF` | If `ON`, adds "-SNAPSHOT" to version portion of names of Maven artifacts. | +| `HDF5_JAVA_LOGGING_JAR` | `FILEPATH` | Bundled `java/lib/slf4j-api-2.0.16.jar` | Path to the SLF4J API jar. | +| `HDF5_JAVA_LOGGING_NOP_JAR` | `FILEPATH` | Bundled `java/lib/ext/slf4j-nop-2.0.16.jar` | Path to the SLF4J NOP binding jar. | +| `HDF5_JAVA_LOGGING_SIMPLE_JAR` | `FILEPATH` | Bundled `java/lib/ext/slf4j-simple-2.0.16.jar` | Path to the SLF4J simple binding jar. | +| `HDF5_JAVA_JUNIT_JAR` | `FILEPATH` | Bundled `java/lib/org.junit.jar` | Path to the JUnit 4 jar. | +| `HDF5_JAVA_HAMCREST_JAR` | `FILEPATH` | Bundled `java/lib/org.hamcrest.jar` | Path to the Hamcrest jar. | ### C++ options diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt index 7e845943935..615914b19a6 100644 --- a/java/CMakeLists.txt +++ b/java/CMakeLists.txt @@ -25,6 +25,41 @@ set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${HDF5_JAVA_INCLUDE_DIR set (CMAKE_JAVA_INCLUDE_PATH "") +#----------------------------------------------------------------------------- +# Configurable paths for Java dependency JARs +#----------------------------------------------------------------------------- +set (HDF5_JAVA_LOGGING_JAR ${HDF5_JAVA_LIB_DIR}/slf4j-api-2.0.16.jar CACHE FILEPATH "Path to SLF4J API jar (used at compile and runtime)") +set (HDF5_JAVA_LOGGING_NOP_JAR ${HDF5_JAVA_LIB_DIR}/ext/slf4j-nop-2.0.16.jar CACHE FILEPATH "Path to SLF4J NOP binding jar (suppresses logging when no other backend is present)") +set (HDF5_JAVA_LOGGING_SIMPLE_JAR ${HDF5_JAVA_LIB_DIR}/ext/slf4j-simple-2.0.16.jar CACHE FILEPATH "Path to SLF4J simple binding jar (used in tests for basic stdout logging)") +set (HDF5_JAVA_JUNIT_JAR ${HDF5_JAVA_LIB_DIR}/org.junit.jar CACHE FILEPATH "Path to JUnit 4 jar (test-only dependency)") +set (HDF5_JAVA_HAMCREST_JAR ${HDF5_JAVA_LIB_DIR}/org.hamcrest.jar CACHE FILEPATH "Path to Hamcrest jar (test-only dependency, required by JUnit 4)") + +#----------------------------------------------------------------------------- +# Validate that all required JAR paths exist +#----------------------------------------------------------------------------- +set (_HDF5_REQUIRED_JAVA_JARS + HDF5_JAVA_LOGGING_JAR + HDF5_JAVA_LOGGING_NOP_JAR + HDF5_JAVA_LOGGING_SIMPLE_JAR +) +if (NOT HDF5_EXTERNALLY_CONFIGURED AND BUILD_TESTING) + list (APPEND _HDF5_REQUIRED_JAVA_JARS + HDF5_JAVA_JUNIT_JAR + HDF5_JAVA_HAMCREST_JAR + ) +endif () +foreach (_jar_var IN LISTS _HDF5_REQUIRED_JAVA_JARS) + if (DEFINED ${_jar_var} AND NOT "${${_jar_var}}" STREQUAL "") + if (NOT EXISTS "${${_jar_var}}") + message (FATAL_ERROR + "Configured JAR path '${${_jar_var}}' for cache variable " + "'${_jar_var}' does not exist. Please set -D${_jar_var}=." + ) + endif () + endif () +endforeach () +unset (_HDF5_REQUIRED_JAVA_JARS) + if (Java_VERSION_STRING VERSION_GREATER_EQUAL "25.0.0") if (HDF5_ENABLE_JNI) set (HDF5_JAVA_USE_FFM FALSE) diff --git a/java/jtest/CMakeLists.txt b/java/jtest/CMakeLists.txt index fda59573beb..ca3b0a16be3 100644 --- a/java/jtest/CMakeLists.txt +++ b/java/jtest/CMakeLists.txt @@ -62,7 +62,7 @@ set (HDF5_JAVA_JTEST_FFM_TEST_SOURCES ) # Update classpath to include FfmTestSupport JAR for test compilation -set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVAHDF5_JARS};${${HDF5_JAVA_JTEST_LIB_TARGET}_FfmTestSupport_JAR_FILE};${HDF5_JAVA_LIB_DIR}/org.junit.jar;${HDF5_JAVA_LIB_DIR}/org.hamcrest.jar;${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") +set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVAHDF5_JARS};${${HDF5_JAVA_JTEST_LIB_TARGET}_FfmTestSupport_JAR_FILE};${HDF5_JAVA_JUNIT_JAR};${HDF5_JAVA_HAMCREST_JAR};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") foreach (ffm_test_file ${HDF5_JAVA_JTEST_FFM_TEST_SOURCES}) @@ -90,7 +90,7 @@ Enable-Native-Access: ALL-UNNAMED endforeach () # Restore classpath for other tests -set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVAHDF5_JARS};${HDF5_JAVA_LIB_DIR}/org.junit.jar;${HDF5_JAVA_LIB_DIR}/org.hamcrest.jar;${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") +set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVAHDF5_JARS};${HDF5_JAVA_JUNIT_JAR};${HDF5_JAVA_HAMCREST_JAR};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/h5ex_g_iterate.orig" "${PROJECT_BINARY_DIR}/h5ex_g_iterate.hdf" "${HDF5_JAVA_JTEST_LIB_TARGET}_files") HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/h5ex_g_iterate.orig" "${PROJECT_BINARY_DIR}/h5ex_g_iterateL1.hdf" "${HDF5_JAVA_JTEST_LIB_TARGET}_files") diff --git a/java/src-jni/test/CMakeLists.txt b/java/src-jni/test/CMakeLists.txt index b882a0cec5a..d2389483183 100644 --- a/java/src-jni/test/CMakeLists.txt +++ b/java/src-jni/test/CMakeLists.txt @@ -75,7 +75,7 @@ if (HDF5_ENABLE_HDFS) ) endif () -set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_LIB_DIR}/org.junit.jar;${HDF5_JAVA_LIB_DIR}/org.hamcrest.jar;${HDF5_JAVA_JARS};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") +set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JUNIT_JAR};${HDF5_JAVA_HAMCREST_JAR};${HDF5_JAVA_JARS};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") foreach (test_file ${HDF5_JAVA_TEST_SOURCES}) diff --git a/java/test/CMakeLists.txt b/java/test/CMakeLists.txt index b2bc8e86265..318200c62ea 100644 --- a/java/test/CMakeLists.txt +++ b/java/test/CMakeLists.txt @@ -75,7 +75,7 @@ if (HDF5_ENABLE_HDFS) ) endif () -set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS};${HDF5_JAVAHDF5_JARS};${HDF5_JAVA_LIB_DIR}/org.junit.jar;${HDF5_JAVA_LIB_DIR}/org.hamcrest.jar;${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") +set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS};${HDF5_JAVAHDF5_JARS};${HDF5_JAVA_JUNIT_JAR};${HDF5_JAVA_HAMCREST_JAR};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}") foreach (test_file ${HDF5_JAVA_TEST_SOURCES}) diff --git a/release_docs/CHANGELOG.md b/release_docs/CHANGELOG.md index ad90378f341..3fc9d068320 100644 --- a/release_docs/CHANGELOG.md +++ b/release_docs/CHANGELOG.md @@ -42,7 +42,9 @@ For releases prior to version 2.0.0, please see the release.txt file and for mor ## Java Enhancements: - +- Java dependency JAR paths are now configurable CMake cache variables, allowing system-provided JARs to be used in place of the bundled copies. + + ## Acknowledgements: We would like to thank the many HDF5 community members who contributed to this release of HDF5. @@ -111,6 +113,10 @@ We would like to thank the many HDF5 community members who contributed to this r ## Java Library +### Java dependency JAR paths are now user-configurable + + The CMake variables `HDF5_JAVA_LOGGING_JAR`, `HDF5_JAVA_LOGGING_NOP_JAR`, `HDF5_JAVA_LOGGING_SIMPLE_JAR`, `HDF5_JAVA_JUNIT_JAR`, and `HDF5_JAVA_HAMCREST_JAR` are now CMake cache variables with the bundled JARs as defaults. Users can override these at configure time to use system-provided JARs. See `INSTALL_CMake_options.md` for details. + ## Tools ## High-Level APIs