From 7bde0f41a110b022569d49444c114f8c82b0eaf7 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 9 Jan 2026 13:27:40 +0100 Subject: [PATCH 1/2] Rename folder with native binaries from 'lib' to 'lib-native' A folder with a '-' is not considered a package by Java and is then allowed to exist in multiple Jars without causing a split-package issue. Signed-off-by: Jendrik Johannes --- arithmetic/build.gradle | 10 +++++----- blake2bf/build.gradle | 8 ++++---- boringssl/build.gradle | 10 +++++----- .../common/BesuNativeLibraryLoader.java | 4 +++- constantine/build.gradle | 8 ++++---- gnark/build.gradle | 10 +++++----- ipa-multipoint/build.gradle | 10 +++++----- secp256k1/build.gradle | 20 +++++++++---------- secp256r1/build.gradle | 10 +++++----- 9 files changed, 46 insertions(+), 44 deletions(-) diff --git a/arithmetic/build.gradle b/arithmetic/build.gradle index e0b9387b..464281ff 100644 --- a/arithmetic/build.gradle +++ b/arithmetic/build.gradle @@ -32,32 +32,32 @@ dependencies { } task macAarch64LibCopy(type: Copy) { from 'build/darwin-aarch64/lib/libeth_arithmetic.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macAarch64LibCopy task macLibCopy(type: Copy) { from 'build/darwin-x86-64/lib/libeth_arithmetic.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macLibCopy task linuxLibCopy(type: Copy) { from 'build/linux-gnu-x86_64/lib/libeth_arithmetic.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxLibCopy task linuxArm64LibCopy(type: Copy) { from 'build/linux-gnu-aarch64/lib/libeth_arithmetic.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64LibCopy task linuxRiscv64LibCopy(type: Copy) { from 'build/linux-gnu-riscv64/lib/libeth_arithmetic.so' - into 'build/resources/main/lib/riscv64' + into 'build/resources/main/lib-native/riscv64' } processResources.dependsOn linuxRiscv64LibCopy diff --git a/blake2bf/build.gradle b/blake2bf/build.gradle index 790fb537..87599be8 100644 --- a/blake2bf/build.gradle +++ b/blake2bf/build.gradle @@ -28,27 +28,27 @@ dependencies { task macAarch64LibCopy(type: Copy) { from 'build/darwin-aarch64/lib/libblake2bf.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macAarch64LibCopy task macLibCopy(type: Copy) { from 'build/darwin-x86-64/lib/libblake2bf.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macLibCopy task linuxLibCopy(type: Copy) { from 'build/linux-gnu-x86_64/lib/libblake2bf.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxLibCopy task linuxArm64LibCopy(type: Copy) { from 'build/linux-gnu-aarch64/lib/libblake2bf.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64LibCopy diff --git a/boringssl/build.gradle b/boringssl/build.gradle index 625a26b3..4effaabb 100644 --- a/boringssl/build.gradle +++ b/boringssl/build.gradle @@ -33,31 +33,31 @@ dependencies { task macArmLibCopy(type: Copy) { from 'build/darwin-aarch64/lib/libboringssl_precompiles.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macArmLibCopy task macLibCopy(type: Copy) { from 'build/darwin-x86-64/lib/libboringssl_precompiles.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macLibCopy task linuxLibCopy(type: Copy) { from 'build/linux-gnu-x86_64/lib/libboringssl_precompiles.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxLibCopy task linuxArm64LibCopy(type: Copy) { from 'build/linux-gnu-aarch64/lib/libboringssl_precompiles.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64LibCopy task linuxRiscv64LibCopy(type: Copy) { from 'build/linux-gnu-riscv64/lib/libboringssl_precompiles.so' - into 'build/resources/main/lib/riscv64' + into 'build/resources/main/lib-native/riscv64' } processResources.dependsOn linuxRiscv64LibCopy diff --git a/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java b/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java index e4745ad0..9eff1884 100644 --- a/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java +++ b/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java @@ -122,6 +122,8 @@ private static String safeArchLib(String platformNativeLibraryName) { if (Arrays.asList(X86_VARIANTS).contains(arch)) { arch = "x86-64"; } - return String.format("lib/%s/%s", arch, platformNativeLibraryName ); + // It is important that the folder 'lib-native' contains a '-' such that it is only + // folder and not a 'java package' to wich visibility rules may be applied by JPMS. + return String.format("lib-native/%s/%s", arch, platformNativeLibraryName ); } } diff --git a/constantine/build.gradle b/constantine/build.gradle index ee2ab8e2..687669b6 100644 --- a/constantine/build.gradle +++ b/constantine/build.gradle @@ -28,23 +28,23 @@ tasks.withType(JavaCompile) { task macArmLibCopy(type: Copy) { from "build/darwin-aarch64/lib/libconstantinebindings.dylib" - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } task macLibCopy(type: Copy) { from "build/darwin-x86-64/lib/libconstantinebindings.dylib" - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } task linuxLibCopy(type: Copy) { from "build/linux-gnu-x86_64/lib/libconstantinebindings.so" - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } task linuxArm64LibCopy(type: Copy) { from "build/linux-gnu-aarch64/lib/libconstantinebindings.so" - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macArmLibCopy, macLibCopy, linuxLibCopy, linuxArm64LibCopy diff --git a/gnark/build.gradle b/gnark/build.gradle index a8315018..ffd6a68f 100644 --- a/gnark/build.gradle +++ b/gnark/build.gradle @@ -34,7 +34,7 @@ task macArmLibCopy(type: Copy) { from 'build/darwin-aarch64/lib/libgnark_jni.dylib' from 'build/darwin-aarch64/lib/libgnark_eip_2537.dylib' from 'build/darwin-aarch64/lib/libgnark_eip_196.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macArmLibCopy @@ -42,7 +42,7 @@ task macLibCopy(type: Copy) { from 'build/darwin-x86-64/lib/libgnark_jni.dylib' from 'build/darwin-x86-64/lib/libgnark_eip_2537.dylib' from 'build/darwin-x86-64/lib/libgnark_eip_196.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macLibCopy @@ -50,7 +50,7 @@ task linuxLibCopy(type: Copy) { from 'build/linux-gnu-x86_64/lib/libgnark_jni.so' from 'build/linux-gnu-x86_64/lib/libgnark_eip_2537.so' from 'build/linux-gnu-x86_64/lib/libgnark_eip_196.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxLibCopy @@ -58,7 +58,7 @@ task linuxArm64LibCopy(type: Copy) { from 'build/linux-gnu-aarch64/lib/libgnark_jni.so' from 'build/linux-gnu-aarch64/lib/libgnark_eip_2537.so' from 'build/linux-gnu-aarch64/lib/libgnark_eip_196.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64LibCopy @@ -66,7 +66,7 @@ task linuxRiscv64LibCopy(type: Copy) { from 'build/linux-gnu-riscv64/lib/libgnark_jni.so' from 'build/linux-gnu-riscv64/lib/libgnark_eip_2537.so' from 'build/linux-gnu-riscv64/lib/libgnark_eip_196.so' - into 'build/resources/main/lib/riscv64' + into 'build/resources/main/lib-native/riscv64' } processResources.dependsOn linuxRiscv64LibCopy diff --git a/ipa-multipoint/build.gradle b/ipa-multipoint/build.gradle index 808b4cdd..f9db7fc6 100644 --- a/ipa-multipoint/build.gradle +++ b/ipa-multipoint/build.gradle @@ -44,31 +44,31 @@ sourceSets { task macArmLibCopy(type: Copy) { from 'build/darwin-aarch64/lib/libipa_multipoint_jni.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macArmLibCopy task macLibCopy(type: Copy) { from 'build/darwin-x86-64/lib/libipa_multipoint_jni.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macLibCopy task linuxLibCopy(type: Copy) { from 'build/linux-gnu-x86_64/lib/libipa_multipoint_jni.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxLibCopy task linuxArm64LibCopy(type: Copy) { from 'build/linux-gnu-aarch64/lib/libipa_multipoint_jni.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64LibCopy task linuxRiscv64LibCopy(type: Copy) { from 'build/linux-gnu-riscv64/lib/libipa_multipoint_jni.so' - into 'build/resources/main/lib/riscv64' + into 'build/resources/main/lib-native/riscv64' } processResources.dependsOn linuxRiscv64LibCopy diff --git a/secp256k1/build.gradle b/secp256k1/build.gradle index f396f7a7..2d5fa4da 100644 --- a/secp256k1/build.gradle +++ b/secp256k1/build.gradle @@ -33,62 +33,62 @@ dependencies { task macArmLibCopy(type: Copy) { from 'build/darwin-aarch64/lib/libsecp256k1.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macArmLibCopy task macLibCopy(type: Copy) { from 'build/darwin-x86-64/lib/libsecp256k1.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macLibCopy task linuxLibCopy(type: Copy) { from 'build/linux-gnu-x86_64/lib/libsecp256k1.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxLibCopy task linuxArm64LibCopy(type: Copy) { from 'build/linux-gnu-aarch64/lib/libsecp256k1.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64LibCopy task linuxRiscv64LibCopy(type: Copy) { from 'build/linux-gnu-riscv64/lib/libsecp256k1.so' - into 'build/resources/main/lib/riscv64' + into 'build/resources/main/lib-native/riscv64' } processResources.dependsOn linuxRiscv64LibCopy // JNI library copy tasks task macArmJNILibCopy(type: Copy) { from 'build/darwin-aarch64/lib/libsecp256k1_ecrecover.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macArmJNILibCopy task macJNILibCopy(type: Copy) { from 'build/darwin-x86-64/lib/libsecp256k1_ecrecover.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macJNILibCopy task linuxJNILibCopy(type: Copy) { from 'build/linux-gnu-x86_64/lib/libsecp256k1_ecrecover.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxJNILibCopy task linuxArm64JNILibCopy(type: Copy) { from 'build/linux-gnu-aarch64/lib/libsecp256k1_ecrecover.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64JNILibCopy task linuxRiscv64JNILibCopy(type: Copy) { from 'build/linux-gnu-riscv64/lib/libsecp256k1_ecrecover.so' - into 'build/resources/main/lib/riscv64' + into 'build/resources/main/lib-native/riscv64' } processResources.dependsOn linuxRiscv64JNILibCopy diff --git a/secp256r1/build.gradle b/secp256r1/build.gradle index f8c82db0..5685ba68 100644 --- a/secp256r1/build.gradle +++ b/secp256r1/build.gradle @@ -40,35 +40,35 @@ tasks.named('compileTestJava').configure { task macArmLibCopy(type: Copy) { from 'besu-native-ec/release/darwin-aarch64/libbesu_native_ec.dylib' from 'besu-native-ec/release/darwin-aarch64/libbesu_native_ec_crypto.dylib' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn macArmLibCopy task macLibCopy(type: Copy) { from 'besu-native-ec/release/darwin-x86-64/libbesu_native_ec.dylib' from 'besu-native-ec/release/darwin-x86-64/libbesu_native_ec_crypto.dylib' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn macLibCopy task linuxLibCopy(type: Copy) { from 'besu-native-ec/release/linux-gnu-x86_64/libbesu_native_ec.so' from 'besu-native-ec/release/linux-gnu-x86_64/libbesu_native_ec_crypto.so' - into 'build/resources/main/lib/x86-64' + into 'build/resources/main/lib-native/x86-64' } processResources.dependsOn linuxLibCopy task linuxArm64LibCopy(type: Copy) { from 'besu-native-ec/release/linux-gnu-aarch64/libbesu_native_ec.so' from 'besu-native-ec/release/linux-gnu-aarch64/libbesu_native_ec_crypto.so' - into 'build/resources/main/lib/aarch64' + into 'build/resources/main/lib-native/aarch64' } processResources.dependsOn linuxArm64LibCopy task linuxRiscv64LibCopy(type: Copy) { from 'besu-native-ec/release/linux-gnu-riscv64/libbesu_native_ec.so' from 'besu-native-ec/release/linux-gnu-riscv64/libbesu_native_ec_crypto.so' - into 'build/resources/main/lib/riscv64' + into 'build/resources/main/lib-native/riscv64' } processResources.dependsOn linuxRiscv64LibCopy From ceb4d8aa0d97158166df730daf0d109771da0462 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 9 Jan 2026 13:25:00 +0100 Subject: [PATCH 2/2] Use calling class as resource access context in BesuNativeLibraryLoader When running on the --module-path, the native lib resource is only accessible from within the module if it is not located a folder that represents an explicitly exported java package. Signed-off-by: Jendrik Johannes --- .../besu/nativelib/common/BesuNativeLibraryLoader.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java b/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java index 9eff1884..a085be6a 100644 --- a/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java +++ b/common/src/main/java/org/hyperledger/besu/nativelib/common/BesuNativeLibraryLoader.java @@ -40,7 +40,10 @@ public class BesuNativeLibraryLoader { public static void registerJNA(Class jnaClass, String libraryName) { try { - final Optional libPath = extract(jnaClass, libraryName); + String moduleContextClassName = Thread.currentThread().getStackTrace()[2].getClassName(); + Class moduleContextClass = Class.forName(moduleContextClassName); + + final Optional libPath = extract(moduleContextClass, libraryName); if (libPath.isPresent()) { NativeLibrary lib = NativeLibrary.getInstance(libPath.get().toString()); @@ -55,6 +58,8 @@ public static void registerJNA(Class jnaClass, String libraryName) { "Couldn't load native library (%s). It wasn't available at %s or the library path.", libraryName, asLibraryResourcePath(libraryName)); throw new RuntimeException(exceptionMessage); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); } }