diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd1838a8c..485d8a6e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,6 +48,7 @@ jobs: - 11 - 17 - 21 + - 25 runs-on: ${{ matrix.os }} steps: - name: Checkout diff --git a/archunit/build.gradle b/archunit/build.gradle index 0eda647d7..901be67ad 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 a6460888a..0d8c774c4 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.9.1" } +asmjdkbridge = { module = "codes.rafael.asmjdkbridge:asm-jdk-bridge", version = "0.0.13"} guava = { group = "com.google.guava", name = "guava", version = "33.5.0-jre" } slf4j = { group = "org.slf4j", name = "slf4j-api", version = "2.0.17" } log4j_api = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j" }