On Tue, 22 Apr 2025 10:14:44 GMT, Jan Lahoda <jlah...@openjdk.org> wrote:
>> src/java.base/share/classes/jdk/internal/misc/MethodFinder.java line 89: >> >>> 87: if (mainMethod == null) { >>> 88: //if not public method, try to lookup a non-public one >>> 89: mainMethod = JLA.findMethod(cls, false, "main", >>> String[].class); >> >> Is there a reason why the first findMethod can't use publicOnly=false? > > My reason was that when `publicOnly=false`, there's more classloading > happening (unsurprisingly, as also the non-public methods must be resolved). > Which may lead to a change of behavior if the traditional `public static > main(String[])` exists. > > IIRC there is a test relying on this behavior, but I don't have the name > offhand. Will put it here when I have it. > > For example: > > $ cat Main.java > public class Main { > public static void main(String... args) { > System.err.println("Hello!"); > } > private Missing get() { return null; } > } > $ cat Missing.java > public class Missing { > } > $ jdk-24/bin/javac Main.java Missing.java; rm Missing.class > $ jdk-24/bin/java -classpath . Main > Hello! > $ jdk-without-publicOnly=true/bin/java -classpath . Main > Error: Unable to initialize main class Main > Caused by: java.lang.NoClassDefFoundError: Missing The tests that would be affected by the extra classloading appear to be: test/jdk/java/lang/System/SecurityManagerWarnings.java test/jdk/java/lang/System/LoggerFinder/SignedLoggerFinderTest/SignedLoggerFinderTest.java ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/24438#discussion_r2056303456