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