From de561d05839ec50603813f4091b6a18f85db7150 Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Wed, 25 Sep 2024 23:31:47 +0200 Subject: [PATCH] Treat class files that are not supported by current VM as resources. --- .../main/java/net/bytebuddy/build/Plugin.java | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/byte-buddy-dep/src/main/java/net/bytebuddy/build/Plugin.java b/byte-buddy-dep/src/main/java/net/bytebuddy/build/Plugin.java index c587e4e006..2384b75083 100644 --- a/byte-buddy-dep/src/main/java/net/bytebuddy/build/Plugin.java +++ b/byte-buddy-dep/src/main/java/net/bytebuddy/build/Plugin.java @@ -3007,7 +3007,11 @@ public static Source ofTypes( } for (Map.Entry> versioned : versionedBinaryRepresentations.entrySet()) { for (Map.Entry entry : versioned.getValue().entrySet()) { - storage.put(ClassFileLocator.META_INF_VERSIONS + versioned.getKey().getJavaVersion() + "/" + entry.getKey().getInternalName() + ClassFileLocator.CLASS_FILE_EXTENSION, entry.getValue()); + storage.put(ClassFileLocator.META_INF_VERSIONS + + versioned.getKey().getJavaVersion() + + "/" + + entry.getKey().getInternalName() + + ClassFileLocator.CLASS_FILE_EXTENSION, entry.getValue()); } } return new InMemory(storage); @@ -3339,7 +3343,8 @@ interface Sink extends Closeable { /** * Stores the supplied binary representation of types in this sink. * - * @param version The version of the multi-release jar file. + * @param version The version of the multi-release jar file, which should at least be {@code 8} as previous + * versions are not recognized by regular class loaders. * @param binaryRepresentations The binary representations to store. * @throws IOException If an I/O error occurs. */ @@ -4890,19 +4895,28 @@ public Summary apply(Source source, Target target, List 7 + && classFileVersion != null + && classFileVersion.isAtLeast(ClassFileVersion.JAVA_V9) + && version <= classFileVersion.getJavaVersion()) { + String typeName = name.substring(name.startsWith(ClassFileLocator.META_INF_VERSIONS) + ? name.indexOf('/', ClassFileLocator.META_INF_VERSIONS.length()) + 1 + : 0, name.length() - ClassFileLocator.CLASS_FILE_EXTENSION.length()).replace('/', '.'); + dispatcher.accept(new Preprocessor(element, + typeName, + version, + new SourceEntryPrependingClassFileLocator(typeName, element, classFileLocator), + typePool, + listener, + plugins, + preprocessors), preprocessors.isEmpty()); + } else { + listener.onResource(name); + sink.retain(element); + } } catch (NumberFormatException ignored) { listener.onResource(name); sink.retain(element);