8252919: JDK built with --enable-cds=no fails with NoClassDefFoundError

Reviewed-by: minqi, sundar, alanb, redestad
This commit is contained in:
Mandy Chung 2020-09-10 16:04:58 +00:00
parent 418e4a259c
commit 44a74dac95
2 changed files with 43 additions and 11 deletions

View File

@ -141,6 +141,9 @@ public final class GenerateJLIClassesPlugin implements Plugin {
initialize(in); initialize(in);
// Copy all but DMH_ENTRY to out // Copy all but DMH_ENTRY to out
in.transformAndCopy(entry -> { in.transformAndCopy(entry -> {
// No trace file given. Copy all entries.
if (traceFileStream == null) return entry;
// filter out placeholder entries // filter out placeholder entries
String path = entry.path(); String path = entry.path();
if (path.equals(DIRECT_METHOD_HOLDER_ENTRY) || if (path.equals(DIRECT_METHOD_HOLDER_ENTRY) ||

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -34,8 +34,12 @@ import tests.JImageGenerator;
import tests.JImageValidator; import tests.JImageValidator;
import tests.Result; import tests.Result;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
/* /*
* @test * @test
* @bug 8252919
* @library ../../lib * @library ../../lib
* @summary Test --generate-jli-classes plugin * @summary Test --generate-jli-classes plugin
* @modules java.base/jdk.internal.jimage * @modules java.base/jdk.internal.jimage
@ -45,21 +49,24 @@ import tests.Result;
* jdk.jlink/jdk.tools.jmod * jdk.jlink/jdk.tools.jmod
* jdk.jlink/jdk.tools.jimage * jdk.jlink/jdk.tools.jimage
* @build tests.* * @build tests.*
* @run main/othervm GenerateJLIClassesPluginTest * @run testng/othervm GenerateJLIClassesPluginTest
*/ */
public class GenerateJLIClassesPluginTest { public class GenerateJLIClassesPluginTest {
private static Helper helper; private static Helper helper;
public static void main(String[] args) throws Exception { @BeforeTest
public static void setup() throws Exception {
helper = Helper.newHelper(); helper = Helper.newHelper();
if (helper == null) { if (helper == null) {
System.err.println("Test not run"); System.err.println("Test not run");
return; return;
} }
helper.generateDefaultModules(); helper.generateDefaultModules();
}
@Test
public static void testSpecies() throws IOException {
// Check that --generate-jli-classes=@file works as intended // Check that --generate-jli-classes=@file works as intended
Path baseFile = Files.createTempFile("base", "trace"); Path baseFile = Files.createTempFile("base", "trace");
String species = "LLLLLLLLLLLLLLLLLLL"; String species = "LLLLLLLLLLLLLLLLLLL";
@ -73,27 +80,27 @@ public class GenerateJLIClassesPluginTest {
.call(); .call();
Path image = result.assertSuccess(); Path image = result.assertSuccess();
validateHolderClasses(image);
JImageValidator.validate(image.resolve("lib").resolve("modules"), JImageValidator.validate(image.resolve("lib").resolve("modules"),
classFilesForSpecies(List.of(species)), // species should be in the image classFilesForSpecies(List.of(species)), // species should be in the image
classFilesForSpecies(List.of(species.substring(1)))); // but not it's immediate parent classFilesForSpecies(List.of(species.substring(1)))); // but not it's immediate parent
}
@Test
public static void testInvalidSignatures() throws IOException {
// Check that --generate-jli-classes=@file fails as intended on shapes that can't be generated // Check that --generate-jli-classes=@file fails as intended on shapes that can't be generated
ensureInvalidSignaturesFail( String[] args = new String[] {
"[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeVirtual L_L (success)\n", "[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeVirtual L_L (success)\n",
"[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeInterface L_L (success)\n", "[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeInterface L_L (success)\n",
"[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeStatic I_L (success)\n" "[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeStatic I_L (success)\n"
); };
}
private static void ensureInvalidSignaturesFail(String ... args) throws IOException {
for (String fileString : args) { for (String fileString : args) {
Path failFile = Files.createTempFile("fail", "trace"); Path failFile = Files.createTempFile("fail", "trace");
fileString = "[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeVirtual L_L (success)\n"; fileString = "[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeVirtual L_L (success)\n";
Files.write(failFile, fileString.getBytes(Charset.defaultCharset())); Files.write(failFile, fileString.getBytes(Charset.defaultCharset()));
Result result = JImageGenerator.getJLinkTask() Result result = JImageGenerator.getJLinkTask()
.modulePath(helper.defaultModulePath()) .modulePath(helper.defaultModulePath())
.output(helper.createNewImageDir("generate-jli-file")) .output(helper.createNewImageDir("invalid-signature"))
.option("--generate-jli-classes=@" + failFile.toString()) .option("--generate-jli-classes=@" + failFile.toString())
.addMods("java.base") .addMods("java.base")
.call(); .call();
@ -102,6 +109,28 @@ public class GenerateJLIClassesPluginTest {
} }
} }
@Test
public static void nonExistentTraceFile() throws IOException {
Result result = JImageGenerator.getJLinkTask()
.modulePath(helper.defaultModulePath())
.output(helper.createNewImageDir("non-existent-tracefile"))
.option("--generate-jli-classes=@NON_EXISTENT_FILE")
.addMods("java.base")
.call();
Path image = result.assertSuccess();
validateHolderClasses(image);
}
private static void validateHolderClasses(Path image) throws IOException {
JImageValidator.validate(image.resolve("lib").resolve("modules"),
List.of("/java.base/java/lang/invoke/DirectMethodHandle$Holder.class",
"/java.base/java/lang/invoke/DelegatingMethodHandle$Holder.class",
"/java.base/java/lang/invoke/LambdaForm$Holder.class",
"/java.base/java/lang/invoke/Invokers$Holder.class"),
List.of());
}
private static List<String> classFilesForSpecies(Collection<String> species) { private static List<String> classFilesForSpecies(Collection<String> species) {
return species.stream() return species.stream()
.map(s -> "/java.base/java/lang/invoke/BoundMethodHandle$Species_" + s + ".class") .map(s -> "/java.base/java/lang/invoke/BoundMethodHandle$Species_" + s + ".class")