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

native-image fails to build for a jar containing the JDBC MySQL driver #1924

Closed
grishka opened this issue Dec 3, 2019 · 10 comments
Closed
Assignees

Comments

@grishka
Copy link

grishka commented Dec 3, 2019

MySQL driver version: 8.0.18 (from Maven)

Build command and its output:

$ native-image -jar server-0.0.1-pre-alpha-jar-with-dependencies.jar --allow-incomplete-classpath --no-fallback
Build on Server(pid: 33152, port: 62211)
[server-0.0.1-pre-alpha-jar-with-dependencies:33152]    classlist:   2,336.87 ms
[server-0.0.1-pre-alpha-jar-with-dependencies:33152]        (cap):   1,279.55 ms
[server-0.0.1-pre-alpha-jar-with-dependencies:33152]        setup:   1,657.78 ms
[server-0.0.1-pre-alpha-jar-with-dependencies:33152]     analysis:  12,817.17 ms
Error: No instances of com.mysql.cj.jdbc.Driver are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use -H:+TraceClassInitialization.
Detailed message:
Trace: 	object java.sql.DriverInfo
	object java.lang.Object[]
	object java.util.concurrent.CopyOnWriteArrayList
	method java.sql.DriverManager.getConnection(String, Properties, Class)
Call path from entry point to java.sql.DriverManager.getConnection(String, Properties, Class): 
	at java.sql.DriverManager.getConnection(DriverManager.java:640)
	at java.sql.DriverManager.getConnection(DriverManager.java:270)
	at smithereen.storage.DatabaseConnectionManager.getConnection(DatabaseConnectionManager.java:17)
	at smithereen.storage.SessionStorage.fillSession(SessionStorage.java:50)
	at smithereen.Main.lambda$main$0(Main.java:62)
	at smithereen.Main$$Lambda$993/513704020.handle(Unknown Source)
	at spark.FilterImpl$1.handle(FilterImpl.java:73)
	at spark.http.matching.BeforeFilters.execute(BeforeFilters.java:48)
	at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:133)
	at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.Server.handle(Server.java:502)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:425)
	at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:311)
	at com.oracle.svm.core.jdk.RuntimeSupport.executeHooks(RuntimeSupport.java:144)
	at com.oracle.svm.core.jdk.RuntimeSupport.executeStartupHooks(RuntimeSupport.java:89)
	at com.oracle.svm.core.JavaMainWrapper.runCore(JavaMainWrapper.java:143)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:186)
	at com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0)

Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1

I used --allow-incomplete-classpath because the Spark framework uses the SLF4J logging library only if it's available on the classpath, and I don't want to include it in my build.

@vjovanov
Copy link
Member

Have you tried using -H:+TraceClassInitialization? It should show you where the object got instantiated.

@grishka
Copy link
Author

grishka commented Dec 29, 2019

I tried now. It told me to add --initialize-at-build-time=com.mysql.cj.jdbc.Driver, so I did. I now get another error (added -H:+ReportExceptionStackTraces to see the details, as it asked):

$ native-image -jar smithereen-jar-with-dependencies.jar --allow-incomplete-classpath --no-fallback --initialize-at-build-time=com.mysql.cj.jdbc.Driver -H:+TraceClassInitialization -H:+ReportExceptionStackTraces
Build on Server(pid: 18153, port: 61389)
[smithereen-jar-with-dependencies:18153]    classlist:   3,079.52 ms
[smithereen-jar-with-dependencies:18153]        (cap):   1,523.29 ms
[smithereen-jar-with-dependencies:18153]        setup:   1,961.66 ms
[smithereen-jar-with-dependencies:18153]     analysis:  11,327.32 ms
Error: Error encountered while parsing com.mysql.cj.jdbc.ha.ReplicationConnectionProxy.createProxyInstance(com.mysql.cj.conf.url.ReplicationConnectionUrl) 
Parsing context:
	parsing com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:208)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:664)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:270)
	parsing smithereen.storage.DatabaseConnectionManager.getConnection(DatabaseConnectionManager.java:17)
	parsing smithereen.storage.SessionStorage.fillSession(SessionStorage.java:52)
	parsing smithereen.Main.lambda$main$0(Main.java:68)
	parsing smithereen.Main$$Lambda$766/676809618.handle(Unknown Source)
	parsing spark.FilterImpl$1.handle(FilterImpl.java:73)
	parsing spark.http.matching.AfterFilters.execute(AfterFilters.java:55)
	parsing spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:135)
	parsing spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
	parsing org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	parsing org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	parsing org.eclipse.jetty.server.Server.handleAsync(Server.java:550)
	parsing org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:394)
	parsing org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:311)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeHooks(RuntimeSupport.java:144)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeTearDownHooks(RuntimeSupport.java:121)
	parsing com.oracle.svm.core.graal.snippets.CEntryPointSnippets.tearDownIsolate(CEntryPointSnippets.java:300)

com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing com.mysql.cj.jdbc.ha.ReplicationConnectionProxy.createProxyInstance(com.mysql.cj.conf.url.ReplicationConnectionUrl) 
Parsing context:
	parsing com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:208)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:664)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:270)
	parsing smithereen.storage.DatabaseConnectionManager.getConnection(DatabaseConnectionManager.java:17)
	parsing smithereen.storage.SessionStorage.fillSession(SessionStorage.java:52)
	parsing smithereen.Main.lambda$main$0(Main.java:68)
	parsing smithereen.Main$$Lambda$766/676809618.handle(Unknown Source)
	parsing spark.FilterImpl$1.handle(FilterImpl.java:73)
	parsing spark.http.matching.AfterFilters.execute(AfterFilters.java:55)
	parsing spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:135)
	parsing spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
	parsing org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	parsing org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	parsing org.eclipse.jetty.server.Server.handleAsync(Server.java:550)
	parsing org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:394)
	parsing org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:311)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeHooks(RuntimeSupport.java:144)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeTearDownHooks(RuntimeSupport.java:121)
	parsing com.oracle.svm.core.graal.snippets.CEntryPointSnippets.tearDownIsolate(CEntryPointSnippets.java:300)

	at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:138)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:323)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)
	at com.oracle.graal.pointsto.flow.StaticInvokeTypeFlow.update(InvokeTypeFlow.java:346)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:510)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:171)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: java.lang.IllegalArgumentException: interface com.mysql.cj.jdbc.ha.ReplicationConnection is not visible from class loader
	at parsing com.mysql.cj.jdbc.ha.ReplicationConnectionProxy.createProxyInstance(ReplicationConnectionProxy.java:85)
	at org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2470)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:92)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3272)
	at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3074)
	at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:976)
	at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:870)
	at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84)
	at org.graalvm.compiler.phases.Phase.run(Phase.java:49)
	at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:197)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:221)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:340)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
	... 10 more
Caused by: java.lang.IllegalArgumentException: interface com.mysql.cj.jdbc.ha.ReplicationConnection is not visible from class loader
	at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:581)
	at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:557)
	at java.lang.reflect.WeakCache$Factory.get(WeakCache.java:230)
	at java.lang.reflect.WeakCache.get(WeakCache.java:127)
	at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:419)
	at java.lang.reflect.Proxy.getProxyClass(Proxy.java:371)
	at com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry.getProxyClass(DynamicProxyRegistry.java:44)
	at com.oracle.svm.reflect.proxy.DynamicProxySupport.lambda$addProxyClass$0(DynamicProxySupport.java:94)
	at java.util.HashMap.computeIfAbsent(HashMap.java:1127)
	at com.oracle.svm.reflect.proxy.DynamicProxySupport.addProxyClass(DynamicProxySupport.java:94)
	at com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins.interceptProxyInterfaces(SubstrateGraphBuilderPlugins.java:243)
	at com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins.access$000(SubstrateGraphBuilderPlugins.java:147)
	at com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins$6.apply(SubstrateGraphBuilderPlugins.java:227)
	at org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.execute(InvocationPlugin.java:217)
	at org.graalvm.compiler.java.BytecodeParser.tryInvocationPlugin(BytecodeParser.java:2092)
	at com.oracle.svm.hosted.phases.AnalysisGraphBuilderPhase$AnalysisBytecodeParser.tryInvocationPlugin(AnalysisGraphBuilderPhase.java:67)
	at org.graalvm.compiler.java.BytecodeParser.appendInvoke(BytecodeParser.java:1801)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1566)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1546)
	at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5125)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3267)
	... 21 more
Error: Error encountered while parsing com.mysql.cj.jdbc.ha.FailoverConnectionProxy.createProxyInstance(com.mysql.cj.conf.ConnectionUrl) 
Parsing context:
	parsing com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:205)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:664)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:270)
	parsing smithereen.storage.DatabaseConnectionManager.getConnection(DatabaseConnectionManager.java:17)
	parsing smithereen.storage.SessionStorage.fillSession(SessionStorage.java:52)
	parsing smithereen.Main.lambda$main$0(Main.java:68)
	parsing smithereen.Main$$Lambda$766/676809618.handle(Unknown Source)
	parsing spark.FilterImpl$1.handle(FilterImpl.java:73)
	parsing spark.http.matching.AfterFilters.execute(AfterFilters.java:55)
	parsing spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:135)
	parsing spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
	parsing org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	parsing org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	parsing org.eclipse.jetty.server.Server.handleAsync(Server.java:550)
	parsing org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:394)
	parsing org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:311)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeHooks(RuntimeSupport.java:144)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeTearDownHooks(RuntimeSupport.java:121)
	parsing com.oracle.svm.core.graal.snippets.CEntryPointSnippets.tearDownIsolate(CEntryPointSnippets.java:300)

com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing com.mysql.cj.jdbc.ha.FailoverConnectionProxy.createProxyInstance(com.mysql.cj.conf.ConnectionUrl) 
Parsing context:
	parsing com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:205)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:664)
	parsing java.sql.DriverManager.getConnection(DriverManager.java:270)
	parsing smithereen.storage.DatabaseConnectionManager.getConnection(DatabaseConnectionManager.java:17)
	parsing smithereen.storage.SessionStorage.fillSession(SessionStorage.java:52)
	parsing smithereen.Main.lambda$main$0(Main.java:68)
	parsing smithereen.Main$$Lambda$766/676809618.handle(Unknown Source)
	parsing spark.FilterImpl$1.handle(FilterImpl.java:73)
	parsing spark.http.matching.AfterFilters.execute(AfterFilters.java:55)
	parsing spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:135)
	parsing spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
	parsing org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	parsing org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	parsing org.eclipse.jetty.server.Server.handleAsync(Server.java:550)
	parsing org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:394)
	parsing org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:311)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeHooks(RuntimeSupport.java:144)
	parsing com.oracle.svm.core.jdk.RuntimeSupport.executeTearDownHooks(RuntimeSupport.java:121)
	parsing com.oracle.svm.core.graal.snippets.CEntryPointSnippets.tearDownIsolate(CEntryPointSnippets.java:300)

	at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:138)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:323)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)
	at com.oracle.graal.pointsto.flow.StaticInvokeTypeFlow.update(InvokeTypeFlow.java:346)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:510)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:171)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: java.lang.IllegalArgumentException: interface com.mysql.cj.jdbc.JdbcConnection is not visible from class loader
	at parsing com.mysql.cj.jdbc.ha.FailoverConnectionProxy.createProxyInstance(FailoverConnectionProxy.java:112)
	at org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2470)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:92)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3272)
	at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3074)
	at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:976)
	at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:870)
	at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84)
	at org.graalvm.compiler.phases.Phase.run(Phase.java:49)
	at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:197)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:221)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:340)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
	... 10 more
Caused by: java.lang.IllegalArgumentException: interface com.mysql.cj.jdbc.JdbcConnection is not visible from class loader
	at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:581)
	at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:557)
	at java.lang.reflect.WeakCache$Factory.get(WeakCache.java:230)
	at java.lang.reflect.WeakCache.get(WeakCache.java:127)
	at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:419)
	at java.lang.reflect.Proxy.getProxyClass(Proxy.java:371)
	at com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry.getProxyClass(DynamicProxyRegistry.java:44)
	at com.oracle.svm.reflect.proxy.DynamicProxySupport.lambda$addProxyClass$0(DynamicProxySupport.java:94)
	at java.util.HashMap.computeIfAbsent(HashMap.java:1127)
	at com.oracle.svm.reflect.proxy.DynamicProxySupport.addProxyClass(DynamicProxySupport.java:94)
	at com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins.interceptProxyInterfaces(SubstrateGraphBuilderPlugins.java:243)
	at com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins.access$000(SubstrateGraphBuilderPlugins.java:147)
	at com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins$6.apply(SubstrateGraphBuilderPlugins.java:227)
	at org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.execute(InvocationPlugin.java:217)
	at org.graalvm.compiler.java.BytecodeParser.tryInvocationPlugin(BytecodeParser.java:2092)
	at com.oracle.svm.hosted.phases.AnalysisGraphBuilderPhase$AnalysisBytecodeParser.tryInvocationPlugin(AnalysisGraphBuilderPhase.java:67)
	at org.graalvm.compiler.java.BytecodeParser.appendInvoke(BytecodeParser.java:1801)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1566)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1546)
	at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5125)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3267)
	... 21 more
Error: Image build request failed with exit status 1

@vjovanov
Copy link
Member

vjovanov commented Jan 6, 2020

OK, this is now a separate issue. Assigning accordingly.

@vjovanov vjovanov added the bug label Jan 6, 2020
@vjovanov vjovanov assigned cstancu and unassigned vjovanov Jan 6, 2020
@cstancu
Copy link
Member

cstancu commented Jan 6, 2020

Can you try with the latest GraalVM built from master? Problems like interface com.mysql.cj.jdbc.JdbcConnection is not visible from class loader should have been fixed by a recent change by @eginez .

@grishka
Copy link
Author

grishka commented Jan 6, 2020

Are there any prebuilt binaries (aka "nightly builds") available or do I need to build it myself?

@cstancu
Copy link
Member

cstancu commented Jan 6, 2020

You would need to build it yourself for now. We plan to have nightlies in the near future. Instructions for building are here https://github.com/oracle/graal/tree/master/vm#vm-suite

@grishka
Copy link
Author

grishka commented Jan 11, 2020

Well it definitely got further this time. I used commit fa02eac and this JDK build (unpacking it and setting Contents/Home as JAVA_HOME did the trick).

I tried different combinations of --initialize-at-run-time=... and --initialize-at-build-time=... with classes related to the MySQL driver and this one gets farthest.

$ mx native-image -jar /Users/grishka/Documents/dev/smithereen/target/smithereen-jar-with-dependencies.jar --allow-incomplete-classpath --no-fallback --initialize-at-run-time=com.mysql.cj.jdbc.Driver --initialize-at-run-time=com.mysql.cj.jdbc.AbandonedConnectionCleanupThread --initialize-at-run-time=java.sql.DriverManager -H:+TraceClassInitialization
[smithereen-jar-with-dependencies:18690]    classlist:   9,062.87 ms,  1.68 GB
[smithereen-jar-with-dependencies:18690]        (cap):   2,594.94 ms,  1.68 GB
[smithereen-jar-with-dependencies:18690]        setup:   5,384.01 ms,  1.82 GB
[smithereen-jar-with-dependencies:18690]   (typeflow):  22,315.55 ms,  3.33 GB
[smithereen-jar-with-dependencies:18690]    (objects):  17,723.20 ms,  3.33 GB
[smithereen-jar-with-dependencies:18690]   (features):   1,109.27 ms,  3.33 GB
[smithereen-jar-with-dependencies:18690]     analysis:  42,667.65 ms,  3.33 GB
Error: com.oracle.svm.hosted.substitute.DeletedElementException: Unsupported method java.lang.ClassLoader.defineClass1(String, byte[], int, int, ProtectionDomain, String) is reachable
To diagnose the issue, you can add the option --report-unsupported-elements-at-runtime. The unsupported element is then reported at run time when it is accessed the first time.
Detailed message:
Trace: 
	at parsing java.lang.ClassLoader.defineClass(ClassLoader.java:756)
Call path from entry point to java.lang.ClassLoader.defineClass(String, byte[], int, int, ProtectionDomain): 
	at java.lang.ClassLoader.defineClass(ClassLoader.java:754)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:635)
	at com.oracle.svm.reflect.ClassLoader_defineClass_c6c343b4d6dc22ca64eb2d8503b13ac9c340dcb3_116.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.mysql.cj.jdbc.ha.MultiHostConnectionProxy$JdbcInterfaceProxy.invoke(MultiHostConnectionProxy.java:108)
	at com.sun.proxy.$Proxy138.hashCode(Unknown Source)
	at java.util.HashMap.hash(HashMap.java:339)
	at java.util.HashMap.get(HashMap.java:557)
	at com.oracle.svm.core.jdk.Target_java_nio_charset_Charset.lookup(CharsetSubstitutions.java:74)
	at java.nio.charset.Charset.isSupported(Charset.java:505)
	at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VARARGS:Ljava_nio_charset_Charset_2_0002eisSupported_00028Ljava_lang_String_2_00029Z(generated:0)

Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1

@grishka
Copy link
Author

grishka commented Jan 11, 2020

Tried adding --report-unsupported-elements-at-runtime hoping this code path won't actually end up being used because why would it need to load classes anyway and where are those classes going to come from. Compilation completes successfully but then the thing crashes at launch. Good news is that the crash isn't related to the MySQL driver, probably related to the use of reflection by some of the dependencies, and so is out of scope of this issue.

@SchulteMarkus
Copy link

Maybe related quarkusio/quarkus#7936 ?

@cstancu
Copy link
Member

cstancu commented Sep 25, 2020

Quarkus currently contains the necessary config for MySql. See #1748 (comment)

@cstancu cstancu closed this as completed Sep 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants