8252919: JDK built with --enable-cds=no fails with NoClassDefFoundError
Reviewed-by: minqi, sundar, alanb, redestad
This commit is contained in:
parent
418e4a259c
commit
44a74dac95
@ -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) ||
|
||||||
|
@ -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")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user