Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -141,6 +141,9 @@ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
initialize(in);
// Copy all but DMH_ENTRY to out
in.transformAndCopy(entry -> {
// No trace file given. Copy all entries.
if (traceFileStream == null) return entry;

// filter out placeholder entries
String path = entry.path();
if (path.equals(DIRECT_METHOD_HOLDER_ENTRY) ||
Expand Down
51 changes: 40 additions & 11 deletions test/jdk/tools/jlink/plugins/GenerateJLIClassesPluginTest.java
@@ -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.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -34,8 +34,12 @@
import tests.JImageValidator;
import tests.Result;

import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

/*
* @test
* @bug 8252919
* @library ../../lib
* @summary Test --generate-jli-classes plugin
* @modules java.base/jdk.internal.jimage
Expand All @@ -45,21 +49,24 @@
* jdk.jlink/jdk.tools.jmod
* jdk.jlink/jdk.tools.jimage
* @build tests.*
* @run main/othervm GenerateJLIClassesPluginTest
* @run testng/othervm GenerateJLIClassesPluginTest
*/
public class GenerateJLIClassesPluginTest {

private static Helper helper;

public static void main(String[] args) throws Exception {
@BeforeTest
public static void setup() throws Exception {
helper = Helper.newHelper();
if (helper == null) {
System.err.println("Test not run");
return;
}

helper.generateDefaultModules();
}

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

Path image = result.assertSuccess();

validateHolderClasses(image);
JImageValidator.validate(image.resolve("lib").resolve("modules"),
classFilesForSpecies(List.of(species)), // species should be in the image
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
ensureInvalidSignaturesFail(
String[] args = new String[] {
"[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 invokeStatic I_L (success)\n"
);
}

private static void ensureInvalidSignaturesFail(String ... args) throws IOException {
};
for (String fileString : args) {
Path failFile = Files.createTempFile("fail", "trace");
fileString = "[LF_RESOLVE] java.lang.invoke.DirectMethodHandle$Holder invokeVirtual L_L (success)\n";
Files.write(failFile, fileString.getBytes(Charset.defaultCharset()));
Result result = JImageGenerator.getJLinkTask()
.modulePath(helper.defaultModulePath())
.output(helper.createNewImageDir("generate-jli-file"))
.output(helper.createNewImageDir("invalid-signature"))
.option("--generate-jli-classes=@" + failFile.toString())
.addMods("java.base")
.call();
Expand All @@ -102,6 +109,28 @@ private static void ensureInvalidSignaturesFail(String ... args) throws IOExcept
}
}

@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) {
return species.stream()
.map(s -> "/java.base/java/lang/invoke/BoundMethodHandle$Species_" + s + ".class")
Expand Down