Skip to content

Commit 0db724f

Browse files
committed
Store all classes that should be initialized at buildtime for earlier JDKs in a separate file
1 parent e8ee113 commit 0db724f

File tree

7 files changed

+77
-44
lines changed

7 files changed

+77
-44
lines changed

Diff for: common/junit-platform-native/src/main/java/org/graalvm/junit/platform/JUnitPlatformFeature.java

+21
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.graalvm.junit.platform.config.core.PluginConfigProvider;
4545
import org.graalvm.nativeimage.ImageSingletons;
4646
import org.graalvm.nativeimage.hosted.Feature;
47+
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
4748
import org.graalvm.nativeimage.hosted.RuntimeReflection;
4849

4950
import org.junit.platform.engine.DiscoverySelector;
@@ -58,7 +59,10 @@
5859
import org.junit.platform.launcher.core.LauncherFactory;
5960
import org.junit.platform.launcher.listeners.UniqueIdTrackingListener;
6061

62+
import java.io.BufferedReader;
6163
import java.io.IOException;
64+
import java.io.InputStream;
65+
import java.io.InputStreamReader;
6266
import java.io.UncheckedIOException;
6367
import java.nio.file.Files;
6468
import java.nio.file.Path;
@@ -99,6 +103,12 @@ public void duringSetup(DuringSetupAccess access) {
99103

100104
@Override
101105
public void beforeAnalysis(BeforeAnalysisAccess access) {
106+
/* Before GraalVM version 22 we couldn't have classes initialized at run-time
107+
* that are also used at build-time but not added to the image heap */
108+
if (Runtime.version().feature() <= 21) {
109+
initializeClassesForJDKsBefore21();
110+
}
111+
102112
List<? extends DiscoverySelector> selectors = getSelectors();
103113
registerTestClassesForReflection(selectors);
104114

@@ -221,4 +231,15 @@ private static Class<?> findClassOrNull(ClassLoader loader, String className) {
221231
return null;
222232
}
223233
}
234+
235+
private static void initializeClassesForJDKsBefore21() {
236+
try (InputStream is = JUnitPlatformFeature.class.getResourceAsStream("/initialize-at-buildtime")) {
237+
if (is != null) {
238+
BufferedReader br = new BufferedReader(new InputStreamReader(is));
239+
br.lines().forEach(RuntimeClassInitialization::initializeAtBuildTime);
240+
}
241+
} catch (IOException e) {
242+
throw new RuntimeException(e);
243+
}
244+
}
224245
}

Diff for: common/junit-platform-native/src/main/java/org/graalvm/junit/platform/NativeImageJUnitLauncher.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ private static Path getTestIDsFromDefaultLocations() {
201201
System.out.println("[junit-platform-native] WARNING: -djunit.platform.listeners.uid.tracking.output.dir not specified, " +
202202
"trying to find test-ids on default Gradle/Maven locations. " +
203203
"As this is a fallback mode, it could take a while. " +
204-
"This should only happen if you are running tests executable manually.");
204+
"This should only happen if you are running tests executable manually and you didn't pass uid output directory with -djunit.platform.listeners.uid.tracking.output.dir=<path>.");
205205
Path defaultGradleTestIDsLocation = getGradleTestIdsDefaultLocation();
206206
Path defaultMavenTestIDsLocation = getMavenTestIDsDefaultLocation();
207207

Diff for: common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/PluginConfigProvider.java

-10
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@
4141

4242
package org.graalvm.junit.platform.config.core;
4343

44-
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
45-
46-
import java.util.List;
47-
4844
public abstract class PluginConfigProvider {
4945

5046
protected ClassLoader applicationClassLoader;
@@ -59,10 +55,4 @@ public final void initialize(ClassLoader classLoader, NativeImageConfiguration n
5955
applicationClassLoader = classLoader;
6056
nativeImageConfigImpl = nic;
6157
}
62-
63-
protected void initializeClassesForOlderJDKs(List<String> packages) {
64-
if (Runtime.version().feature() <= 21) {
65-
packages.forEach(RuntimeClassInitialization::initializeAtBuildTime);
66-
}
67-
}
6858
}

Diff for: common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java

-10
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,8 @@
6565

6666
public class JupiterConfigProvider extends PluginConfigProvider {
6767

68-
/* Before GraalVM version 22 we couldn't have classes initialized at run-time
69-
that are also used at build-time but not added to the image heap */
70-
private final List<String> packagesForOldInitializationStrategy = List.of(
71-
"org.junit.jupiter.engine",
72-
"org.junit.jupiter.api",
73-
"org.junit.jupiter.params",
74-
"java.beans.Introspector");
75-
7668
@Override
7769
public void onLoad(NativeImageConfiguration config) {
78-
initializeClassesForOlderJDKs(packagesForOldInitializationStrategy);
79-
8070
/* Provide support for Timeout annotation */
8171
config.registerAllClassMembersForReflection(
8272
"org.junit.jupiter.engine.extension.TimeoutExtension$ExecutorResource",

Diff for: common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java

-12
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,10 @@
4646
import org.graalvm.nativeimage.hosted.RuntimeSerialization;
4747
import org.junit.platform.launcher.TestIdentifier;
4848

49-
import java.util.List;
50-
51-
5249
public class PlatformConfigProvider extends PluginConfigProvider {
5350

54-
/* Before GraalVM version 22 we couldn't have classes initialized at run-time
55-
that are also used at build-time but not added to the image heap */
56-
private final List<String> packagesForOldInitializationStrategy = List.of(
57-
"org.junit.platform.engine",
58-
"org.junit.platform.launcher",
59-
"org.junit.platform.commons",
60-
"org.junit.validator.PublicClassValidator");
61-
6251
@Override
6352
public void onLoad(NativeImageConfiguration config) {
64-
initializeClassesForOlderJDKs(packagesForOldInitializationStrategy);
6553
RuntimeSerialization.register(TestIdentifier.class.getDeclaredClasses());
6654
}
6755

Diff for: common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java

-11
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,11 @@
4848

4949
import java.lang.annotation.Annotation;
5050
import java.lang.reflect.Method;
51-
import java.util.List;
5251

5352
public class VintageConfigProvider extends PluginConfigProvider {
5453

55-
/* Before GraalVM version 22 we couldn't have classes initialized at run-time
56-
that are also used at build-time but not added to the image heap */
57-
private final List<String> packagesForOldInitializationStrategy = List.of(
58-
"org.junit.vintage.engine",
59-
"org.junit.runner",
60-
"org.junit.runners",
61-
"org.junit.internal.runners.rules.RuleMemberValidator");
62-
6354
@Override
6455
public void onLoad(NativeImageConfiguration config) {
65-
initializeClassesForOlderJDKs(packagesForOldInitializationStrategy);
66-
6756
try {
6857
RuntimeSerialization.register(Class.forName("org.junit.runner.Result").getDeclaredClasses());
6958
RuntimeReflection.register(Class.forName("org.junit.runner.Description").getDeclaredFields());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
org.junit.jupiter.api.condition.OS
2+
org.junit.jupiter.api.RandomOrdererUtils
3+
org.junit.jupiter.api.MethodOrderer$Random
4+
org.junit.jupiter.api.MethodOrderer$MethodName
5+
org.junit.jupiter.api.MethodOrderer$DisplayName
6+
org.junit.jupiter.params.provider.EnumSource$Mode
7+
org.junit.jupiter.engine.descriptor.DisplayNameUtils
8+
org.junit.jupiter.engine.descriptor.ClassTestDescriptor
9+
org.junit.jupiter.engine.descriptor.JupiterTestDescriptor
10+
org.junit.jupiter.engine.descriptor.JupiterTestDescriptor$1
11+
org.junit.jupiter.engine.descriptor.MethodBasedTestDescriptor
12+
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor
13+
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor
14+
org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor
15+
org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter
16+
org.junit.jupiter.engine.config.EnumConfigurationParameterConverter
17+
org.junit.jupiter.engine.execution.ConditionEvaluator
18+
org.junit.jupiter.engine.discovery.MethodFinder
19+
org.junit.jupiter.engine.discovery.MethodSelectorResolver
20+
org.junit.jupiter.engine.discovery.MethodSelectorResolver$MethodType
21+
org.junit.jupiter.engine.discovery.MethodSelectorResolver$MethodType$1
22+
org.junit.jupiter.engine.discovery.MethodSelectorResolver$MethodType$2
23+
org.junit.jupiter.engine.discovery.MethodSelectorResolver$MethodType$3
24+
org.junit.jupiter.engine.discovery.DiscoverySelectorResolver
25+
org.junit.jupiter.engine.discovery.AbstractOrderingVisitor
26+
org.junit.jupiter.engine.discovery.ClassOrderingVisitor
27+
org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests
28+
org.junit.platform.launcher.TestIdentifier
29+
org.junit.platform.launcher.EngineDiscoveryResult
30+
org.junit.platform.launcher.core.EngineFilterer
31+
org.junit.platform.launcher.core.EngineDiscoveryOrchestrator
32+
org.junit.platform.launcher.core.LauncherConfig
33+
org.junit.platform.launcher.core.LauncherConfigurationParameters
34+
org.junit.platform.launcher.listeners.discovery.LauncherDiscoveryListeners$LauncherDiscoveryListenerType
35+
org.junit.platform.engine.UniqueIdFormat
36+
org.junit.platform.engine.SelectorResolutionResult
37+
org.junit.platform.engine.support.discovery.SelectorResolver$Resolution
38+
org.junit.platform.commons.util.ClasspathScanner
39+
org.junit.platform.commons.util.ReflectionUtils
40+
org.junit.platform.commons.util.StringUtils
41+
org.junit.platform.commons.logging.LoggerFactory
42+
org.junit.platform.commons.logging.LoggerFactory$DelegatingLogger
43+
org.junit.validator.PublicClassValidator
44+
org.junit.vintage.engine.discovery.DefensiveAllDefaultPossibilitiesBuilder
45+
org.junit.vintage.engine.discovery.VintageDiscoverer
46+
org.junit.vintage.engine.JUnit4VersionCheck
47+
org.junit.vintage.engine.support.UniqueIdStringifier
48+
org.junit.vintage.engine.support.UniqueIdReader
49+
org.junit.vintage.engine.descriptor.RunnerTestDescriptor
50+
org.junit.runner.Result
51+
org.junit.runner.Description
52+
org.junit.runners.BlockJUnit4ClassRunner
53+
org.junit.internal.runners.rules.RuleMemberValidator
54+
org.junit.runners.JUnit4
55+
java.beans.Introspector

0 commit comments

Comments
 (0)