Description
I've tried to build a Micronaut Data native-image application with SQL Server support but it fails during the native image creation unless I add the flag --report-unsupported-elements-at-runtime
(which is discouraged).
Then, it fails during execution.
Steps to reproduce the issue:
git clone https://github.com/micronaut-graal-tests/micronaut-data-jdbc-graal
cd micronaut-data-jdbc-graal
git checkout sqlserver
- Use GraalVM from master branch for JDK8
./build-native-image.sh
The error is:
[mn-data-jdbc-graal-sqlserver:5896] classlist: 9,646.21 ms
[mn-data-jdbc-graal-sqlserver:5896] (cap): 962.83 ms
[mn-data-jdbc-graal-sqlserver:5896] setup: 3,457.54 ms
[mn-data-jdbc-graal-sqlserver:5896] (typeflow): 48,680.26 ms
[mn-data-jdbc-graal-sqlserver:5896] (objects): 26,933.52 ms
[mn-data-jdbc-graal-sqlserver:5896] (features): 4,688.49 ms
[mn-data-jdbc-graal-sqlserver:5896] analysis: 85,561.72 ms
Error: com.oracle.svm.hosted.substitute.DeletedElementException: Unsupported type java.util.JapaneseImperialCalendar 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.util.Calendar$Builder.build(Calendar.java:1497)
Call path from entry point to java.util.Calendar$Builder.build():
at java.util.Calendar$Builder.build(Calendar.java:1462)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getMSIAuthToken(SQLServerConnection.java:4376)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getFedAuthToken(SQLServerConnection.java:4189)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.onFedAuthInfo(SQLServerConnection.java:4158)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.processFedAuthInfo(SQLServerConnection.java:4123)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onFedAuthInfo(tdsparser.java:289)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:125)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1620)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeBatch(SQLServerStatement.java:1810)
at com.oracle.svm.reflect.Statement_executeBatch_ad5c04e8bff028e2eba4fdc81e56a0fabddc3502_1700.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.jdbc.pool.PoolProperties.toString(PoolProperties.java:841)
at java.lang.String.valueOf(String.java:2994)
at java.nio.charset.IllegalCharsetNameException.<init>(IllegalCharsetNameException.java:55)
at java.nio.charset.Charset.checkName(Charset.java:315)
at com.oracle.svm.core.jdk.Target_java_nio_charset_Charset.lookup(CharsetSubstitutions.java:78)
at java.nio.charset.Charset.isSupported(Charset.java:505)
at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_ARRAY: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
I've tried initializing a few classes at run-time/build-time but it's not working. I'm not really sure if this is a bug on GraalVM side or something with the SQL Server JDBC driver.
As mentioned before if I add --report-unsupported-elements-at-runtime
I can build the native-image.
For everything to work you need to start SQL Server with:
docker run -it --rm -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=My!Secret123' -e 'MSSQL_PID=Express' -p 1433:1433 mcr.microsoft.com/mssql/server:2017-latest-ubuntu
And then:
$ ./mn-data-jdbc-graal-sqlserver
Dec 02, 2019 1:37:10 PM org.apache.tomcat.jdbc.pool.ConnectionPool init
SEVERE: Unable to create initial connections of pool.
com.microsoft.sqlserver.jdbc.SQLServerException: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver. ClientConnectionId:3a086b66-5507-4db0-95ed-c2f88b8bd124
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2924)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.processEnvChange(SQLServerConnection.java:3803)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEnvChange(tdsparser.java:212)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:84)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:37)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:5067)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3731)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:94)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3675)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7194)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2979)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2488)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2142)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1993)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1164)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:760)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:319)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:212)
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:744)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:676)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:483)
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131)
at io.micronaut.data.jdbc.config.SchemaGenerator.createSchema(SchemaGenerator.java:87)
at io.micronaut.data.jdbc.config.$SchemaGeneratorDefinition.initialize(Unknown Source)
at io.micronaut.data.jdbc.config.$SchemaGeneratorDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1598)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2307)
at io.micronaut.context.DefaultBeanContext.loadContextScopeBean(DefaultBeanContext.java:1899)
at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1262)
at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:236)
at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:2446)
at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:200)
at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:187)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:69)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:307)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:293)
at example.Application.main(Application.java:32)
Caused by: java.io.UnsupportedEncodingException: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver.
at com.microsoft.sqlserver.jdbc.SQLCollation.encodingFromSortId(SQLCollation.java:531)
at com.microsoft.sqlserver.jdbc.SQLCollation.<init>(SQLCollation.java:93)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.processEnvChange(SQLServerConnection.java:3801)
... 38 more
Caused by: java.io.UnsupportedEncodingException: Codepage Cp1252 is not supported by the Java environment.
at com.microsoft.sqlserver.jdbc.Encoding.checkSupported(SQLCollation.java:596)
at com.microsoft.sqlserver.jdbc.SQLCollation$SortOrder.getEncoding(SQLCollation.java:501)
at com.microsoft.sqlserver.jdbc.SQLCollation.encodingFromSortId(SQLCollation.java:527)
... 40 more
13:37:10.410 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Bean definition [io.micronaut.data.jdbc.config.SchemaGenerator] could not be loaded: Error instantiating bean of type [io.micronaut.data.jdbc.config.SchemaGenerator]: Unable to create database schema: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver. ClientConnectionId:3a086b66-5507-4db0-95ed-c2f88b8bd124
io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [io.micronaut.data.jdbc.config.SchemaGenerator] could not be loaded: Error instantiating bean of type [io.micronaut.data.jdbc.config.SchemaGenerator]: Unable to create database schema: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver. ClientConnectionId:3a086b66-5507-4db0-95ed-c2f88b8bd124
at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1264)
at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:236)
at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:2446)
at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:200)
at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:187)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:69)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:307)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:293)
at example.Application.main(Application.java:32)
Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [io.micronaut.data.jdbc.config.SchemaGenerator]: Unable to create database schema: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver. ClientConnectionId:3a086b66-5507-4db0-95ed-c2f88b8bd124
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1626)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2307)
at io.micronaut.context.DefaultBeanContext.loadContextScopeBean(DefaultBeanContext.java:1899)
at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1262)
... 8 common frames omitted
Caused by: io.micronaut.data.exceptions.DataAccessException: Unable to create database schema: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver. ClientConnectionId:3a086b66-5507-4db0-95ed-c2f88b8bd124
at io.micronaut.data.jdbc.config.SchemaGenerator.createSchema(SchemaGenerator.java:161)
at io.micronaut.data.jdbc.config.$SchemaGeneratorDefinition.initialize(Unknown Source)
at io.micronaut.data.jdbc.config.$SchemaGeneratorDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1598)
... 11 common frames omitted
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver. ClientConnectionId:3a086b66-5507-4db0-95ed-c2f88b8bd124
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2924)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.processEnvChange(SQLServerConnection.java:3803)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEnvChange(tdsparser.java:212)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:84)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:37)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:5067)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3731)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:94)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3675)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7194)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2979)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2488)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2142)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1993)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1164)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:760)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:319)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:212)
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:744)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:676)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:483)
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131)
at io.micronaut.data.jdbc.config.SchemaGenerator.createSchema(SchemaGenerator.java:87)
... 14 common frames omitted
Caused by: java.io.UnsupportedEncodingException: SQL Server collation SQL_Latin1_General_CP1_CI_AS is not supported by this driver.
at com.microsoft.sqlserver.jdbc.SQLCollation.encodingFromSortId(SQLCollation.java:531)
at com.microsoft.sqlserver.jdbc.SQLCollation.<init>(SQLCollation.java:93)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.processEnvChange(SQLServerConnection.java:3801)
... 38 common frames omitted
Caused by: java.io.UnsupportedEncodingException: Codepage Cp1252 is not supported by the Java environment.
at com.microsoft.sqlserver.jdbc.Encoding.checkSupported(SQLCollation.java:596)
at com.microsoft.sqlserver.jdbc.SQLCollation$SortOrder.getEncoding(SQLCollation.java:501)
at com.microsoft.sqlserver.jdbc.SQLCollation.encodingFromSortId(SQLCollation.java:527)
... 40 common frames omitted
One final thing I've tried is using the native-image Java Agent to generate all the config files but the result is the same in both cases: unable to build the native-image without --report-unsupported-elements-at-runtime
and same error at runtime with it.