Skip to content

Commit 0129d2f

Browse files
committed
8252919: JDK built with --enable-cds=no fails with NoClassDefFoundError: DirectMethodHandle
1 parent 4333942 commit 0129d2f

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
141141
initialize(in);
142142
// Copy all but DMH_ENTRY to out
143143
in.transformAndCopy(entry -> {
144+
// No trace file given. Copy all entries.
145+
if (traceFileStream == null) return entry;
146+
144147
// filter out placeholder entries
145148
String path = entry.path();
146149
if (path.equals(DIRECT_METHOD_HOLDER_ENTRY) ||

test/jdk/tools/jlink/plugins/GenerateJLIClassesPluginTest.java

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -34,8 +34,12 @@
3434
import tests.JImageValidator;
3535
import tests.Result;
3636

37+
import org.testng.annotations.BeforeTest;
38+
import org.testng.annotations.Test;
39+
3740
/*
3841
* @test
42+
* @bug 8252919
3943
* @library ../../lib
4044
* @summary Test --generate-jli-classes plugin
4145
* @modules java.base/jdk.internal.jimage
@@ -45,21 +49,24 @@
4549
* jdk.jlink/jdk.tools.jmod
4650
* jdk.jlink/jdk.tools.jimage
4751
* @build tests.*
48-
* @run main/othervm GenerateJLIClassesPluginTest
52+
* @run testng/othervm GenerateJLIClassesPluginTest
4953
*/
5054
public class GenerateJLIClassesPluginTest {
5155

5256
private static Helper helper;
5357

54-
public static void main(String[] args) throws Exception {
58+
@BeforeTest
59+
public static void setup() throws Exception {
5560
helper = Helper.newHelper();
5661
if (helper == null) {
5762
System.err.println("Test not run");
5863
return;
5964
}
60-
6165
helper.generateDefaultModules();
66+
}
6267

68+
@Test
69+
public static void testSpecies() throws IOException {
6370
// Check that --generate-jli-classes=@file works as intended
6471
Path baseFile = Files.createTempFile("base", "trace");
6572
String species = "LLLLLLLLLLLLLLLLLLL";
@@ -73,27 +80,27 @@ public static void main(String[] args) throws Exception {
7380
.call();
7481

7582
Path image = result.assertSuccess();
76-
83+
validateHolderClasses(image);
7784
JImageValidator.validate(image.resolve("lib").resolve("modules"),
7885
classFilesForSpecies(List.of(species)), // species should be in the image
7986
classFilesForSpecies(List.of(species.substring(1)))); // but not it's immediate parent
87+
}
8088

89+
@Test
90+
public static void testInvalidSignatures() throws IOException {
8191
// Check that --generate-jli-classes=@file fails as intended on shapes that can't be generated
82-
ensureInvalidSignaturesFail(
92+
String[] args = new String[] {
8393
"[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeVirtual L_L (success)\n",
8494
"[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeInterface L_L (success)\n",
8595
"[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeStatic I_L (success)\n"
86-
);
87-
}
88-
89-
private static void ensureInvalidSignaturesFail(String ... args) throws IOException {
96+
};
9097
for (String fileString : args) {
9198
Path failFile = Files.createTempFile("fail", "trace");
9299
fileString = "[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeVirtual L_L (success)\n";
93100
Files.write(failFile, fileString.getBytes(Charset.defaultCharset()));
94101
Result result = JImageGenerator.getJLinkTask()
95102
.modulePath(helper.defaultModulePath())
96-
.output(helper.createNewImageDir("generate-jli-file"))
103+
.output(helper.createNewImageDir("invalid-signature"))
97104
.option("--generate-jli-classes=@" + failFile.toString())
98105
.addMods("java.base")
99106
.call();
@@ -102,6 +109,28 @@ private static void ensureInvalidSignaturesFail(String ... args) throws IOExcept
102109
}
103110
}
104111

112+
@Test
113+
public static void nonExistentTraceFile() throws IOException {
114+
Result result = JImageGenerator.getJLinkTask()
115+
.modulePath(helper.defaultModulePath())
116+
.output(helper.createNewImageDir("non-existent-tracefile"))
117+
.option("--generate-jli-classes=@NON_EXISTENT_FILE")
118+
.addMods("java.base")
119+
.call();
120+
121+
Path image = result.assertSuccess();
122+
validateHolderClasses(image);
123+
}
124+
125+
private static void validateHolderClasses(Path image) throws IOException {
126+
JImageValidator.validate(image.resolve("lib").resolve("modules"),
127+
List.of("/java.base/java/lang/invoke/DirectMethodHandle$Holder.class",
128+
"/java.base/java/lang/invoke/DelegatingMethodHandle$Holder.class",
129+
"/java.base/java/lang/invoke/LambdaForm$Holder.class",
130+
"/java.base/java/lang/invoke/Invokers$Holder.class"),
131+
List.of());
132+
}
133+
105134
private static List<String> classFilesForSpecies(Collection<String> species) {
106135
return species.stream()
107136
.map(s -> "/java.base/java/lang/invoke/BoundMethodHandle$Species_" + s + ".class")

0 commit comments

Comments
 (0)