From 7fe7c2a23b5be60b5b7781e14c5a568b59add1fc Mon Sep 17 00:00:00 2001 From: John Burns Date: Tue, 21 Apr 2026 09:35:08 -0500 Subject: [PATCH] enable using classfile API on JDK 24+ via asm-jdk-bridge fixes #1608 Signed-off-by: John Burns --- archunit/build.gradle | 1 + .../tngtech/archunit/core/importer/ClassFileProcessor.java | 6 +++--- gradle/libs.versions.toml | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/archunit/build.gradle b/archunit/build.gradle index 38bc20162..a1fa37f50 100644 --- a/archunit/build.gradle +++ b/archunit/build.gradle @@ -7,6 +7,7 @@ ext.moduleName = 'com.tngtech.archunit' dependencies { api libs.slf4j implementation libs.asm + implementation(libs.asmjdkbridge) dependency.addGuava { dependencyNotation, config -> implementation(dependencyNotation, config) } testImplementation libs.log4j.api diff --git a/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileProcessor.java b/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileProcessor.java index d3fc55dc9..6a31e30e6 100644 --- a/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileProcessor.java +++ b/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileProcessor.java @@ -22,6 +22,7 @@ import java.util.Optional; import java.util.Set; +import codes.rafael.asmjdkbridge.ProbingClassReader; import com.tngtech.archunit.ArchConfiguration; import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.JavaClassDescriptor; @@ -40,7 +41,6 @@ import com.tngtech.archunit.core.importer.TryCatchRecorder.TryCatchBlocksFinishedListener; import com.tngtech.archunit.core.importer.resolvers.ClassResolver; import com.tngtech.archunit.core.importer.resolvers.ClassResolver.ClassUriImporter; -import org.objectweb.asm.ClassReader; import org.objectweb.asm.Label; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,7 +66,7 @@ JavaClasses process(ClassFileSource source) { try (InputStream s = location.openStream()) { JavaClassProcessor javaClassProcessor = new JavaClassProcessor(new SourceDescriptor(location.getUri(), md5InClassSourcesEnabled), classDetailsRecorder, accessHandler); - new ClassReader(s).accept(javaClassProcessor, 0); + new ProbingClassReader(s).accept(javaClassProcessor, 0); javaClassProcessor.createJavaClass().ifPresent(importRecord::add); } catch (Exception e) { LOG.warn(String.format("Couldn't import class from %s", location.getUri()), e); @@ -347,7 +347,7 @@ private static class UriImporterOfProcessor implements ClassUriImporter { public Optional tryImport(URI uri) { try (InputStream inputStream = uri.toURL().openStream()) { JavaClassProcessor classProcessor = new JavaClassProcessor(new SourceDescriptor(uri, md5InClassSourcesEnabled), declarationHandler); - new ClassReader(inputStream).accept(classProcessor, 0); + new ProbingClassReader(inputStream).accept(classProcessor, 0); return classProcessor.createJavaClass(); } catch (Exception e) { LOG.warn(String.format("Error during import from %s, falling back to simple import", uri), e); diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ad0258866..05e366760 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,6 +6,7 @@ assertj = "3.27.7" [libraries] asm = { group = "org.ow2.asm", name = "asm", version = "9.10.1" } +asmjdkbridge = { module = "codes.rafael.asmjdkbridge:asm-jdk-bridge", version = "0.0.13"} guava = { group = "com.google.guava", name = "guava", version = "33.6.0-jre" } slf4j = { group = "org.slf4j", name = "slf4j-api", version = "2.0.18" } # in sync with buildSrc/src/main/resources/release_check/archunit.pom log4j_api = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j" }