Hello everyone, I'm getting a strange error on WebSphere 9 (on Ubuntu) when trying to start an application that uses Calcite (shaded) library. The exception message says:
** error [-]: Unexpected error. ** ... ** Caused by: java.lang.BootstrapMethodError: java.lang.ExceptionInInitializerError ** com.onwbp.org.apache.calcite.sql.type.InferTypes.<clinit>(InferTypes.java:41) ** com.onwbp.org.apache.calcite.sql.fun.SqlMultisetSetOperator.<init>(SqlMultisetSetOperator.java:43) ** com.onwbp.org.apache.calcite.sql.fun.SqlStdOperatorTable.<clinit>(SqlStdOperatorTable.java:118) ** com.onwbp.org.apache.calcite.adapter.enumerable.RexToLixTranslator.<clinit>(RexToLixTranslator.java:93) ** java.lang.Class.forNameImpl(Native Method) ** java.lang.Class.forName(Class.java:348) ** java.lang.invoke.MethodType.nonPrimitiveClassFromString(MethodType.java:311) ** java.lang.invoke.MethodType.parseIntoClasses(MethodType.java:373) ** java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:286) ** java.lang.invoke.MethodHandle.getCPMethodTypeAt(Native Method) ** java.lang.invoke.MethodHandle.resolveInvokeDynamic(MethodHandle.java:849) ** ... 74 more ** Caused by: java.lang.ExceptionInInitializerError ** java.lang.J9VMInternals.ensureError(J9VMInternals.java:141) ** java.lang.J9VMInternals.recordInitializationFailure(J9VMInternals.java:130) ** java.lang.Class.forNameImpl(Native Method) ** java.lang.Class.forName(Class.java:348) ** java.lang.invoke.MethodType.nonPrimitiveClassFromString(MethodType.java:311) ** java.lang.invoke.MethodType.parseIntoClasses(MethodType.java:373) ** java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:286) ** java.lang.invoke.MethodHandle.getCPMethodTypeAt(Native Method) ** java.lang.invoke.MethodHandle.resolveInvokeDynamic(MethodHandle.java:849) ** ... 85 more ** Caused by: java.lang.NullPointerException ** com.onwbp.org.apache.calcite.sql.SqlCallBinding.<clinit>(SqlCallBinding.java:60) ** ... 92 more ****** 1 errors, 5 infos. As we can see there is a NPE in SqlCallBinding:60, when it tries to call a method on SqlStdOperatorTable.DEFAULT, which seems to be null [0]. According to the logs, what I think is happening is a circular dependency issue when classes get loaded [1]. However, so far I have only seen this error in WebSphere, in other environments the same application is correctly initialized and launched, and this exception does not happen. Has anyone ever seen an issue like this? Thanks, Ruben WebSphere version is: Integrated Solutions Console, 9.0.0.1 Build Number: cf011636.02 Build Date: 9/6/16 It uses java 8: java version "1.8.0" Java(TM) SE Runtime Environment (build pxa6480sr3fp11-20160817_02(SR3 FP11)) IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64 Compressed References 20160816_315341 (JIT enabled, AOT enabled) J9VM - R28_20160816_1459_B315341 JIT - tr.r14.java.green_20160726_121883 GC - R28_20160816_1459_B315341_CMPRSS J9CL - 20160816_315341) JCL - 20160816_01 based on Oracle jdk8u101-b13 [0] https://github.com/apache/calcite/blob/2e9edae7fc57ab9c9c7c097008724ac99a1791a3/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java#L60 [1] *1) RexToLixTranslator.java* /*90*/ public class RexToLixTranslator implements RexVisitor<RexToLixTranslator.Result> {/*91*/ public static final Map<Method, SqlOperator> JAVA_TO_SQL_METHOD_MAP =/*92*/ Util.mapOf(/*93*/ findMethod(String.class, "toUpperCase"), SqlStdOperatorTable.UPPER,// --> LOAD SqlStdOperatorTable *2) SqlStdOperatorTable.java* /*118*/ public static final SqlMultisetSetOperator MULTISET_UNION_DISTINCT =/*119*/ new SqlMultisetSetOperator("MULTISET UNION DISTINCT", 14, false);// --> LOAD SqlMultisetSetOperator *3) SqlMultisetSetOperator.java* /*42*/ public SqlMultisetSetOperator(String name, int prec, boolean all) {/*43*/ super(/*44*/ name,/*45*/ SqlKind.OTHER,/*46*/ prec,/*47*/ true,/*48*/ ReturnTypes.MULTISET_NULLABLE,/*49*/ InferTypes.FIRST_KNOWN, // --> LOAD InferTypes/*50*/ OperandTypes.MULTISET_MULTISET);/*51*/ this.all = all;/*52*/ } *4) InferTypes.java* /*41*/ public static final SqlOperandTypeInference FIRST_KNOWN =/*42*/ (callBinding, returnType, operandTypes) -> {/*43*/ final RelDataType unknownType =/*44*/ callBinding.getValidator().getUnknownType();/*45*/ RelDataType knownType = unknownType;/*46*/ for (SqlNode operand : callBinding.operands()) {/*47*/ knownType = SqlTypeUtil.deriveType(callBinding, operand);/*48*/ if (!knownType.equals(unknownType)) {/*49*/ break;/*50*/ }/*51*/ } // --> LOAD SqlCallBinding *5) SqlCallBinding.java* /*59*/ private static final SqlCall DEFAULT_CALL =/*60*/ SqlStdOperatorTable.DEFAULT.createCall(SqlParserPos.ZERO);// SqlStdOperatorTable is still loading in 2)! SqlStdOperatorTable.DEFAULT in SqlStdOperatorTable:185 is null => NPE!