{"record":{"id":"562aedca536a946d","repo":"testcontainers/testcontainers-java","slug":"can-t-find-valid-driver-class-for-oceanbase","errorCode":null,"errorMessage":"Can't find valid driver class for OceanBase","messagePattern":"Can't find valid driver class for OceanBase","errorType":"exception","errorClass":"java.lang.RuntimeException","httpStatus":null,"severity":"critical","filePath":"modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseJdbcUtils.java","lineNumber":35,"sourceCode":"    static final String OCEANBASE_LEGACY_JDBC_DRIVER = \"com.alipay.oceanbase.jdbc.Driver\";\n\n    static final List<String> SUPPORTED_DRIVERS = Arrays.asList(\n        OCEANBASE_JDBC_DRIVER,\n        OCEANBASE_LEGACY_JDBC_DRIVER,\n        MYSQL_JDBC_DRIVER,\n        MYSQL_LEGACY_JDBC_DRIVER\n    );\n\n    static String getDriverClass() {\n        for (String driverClass : SUPPORTED_DRIVERS) {\n            try {\n                Class.forName(driverClass);\n                return driverClass;\n            } catch (ClassNotFoundException e) {\n                // try to load next driver\n            }\n        }\n        throw new RuntimeException(\"Can't find valid driver class for OceanBase\");\n    }\n\n    static boolean isMySQLDriver(String driverClassName) {\n        return MYSQL_JDBC_DRIVER.equals(driverClassName) || MYSQL_LEGACY_JDBC_DRIVER.equals(driverClassName);\n    }\n\n    static boolean isOceanBaseDriver(String driverClassName) {\n        return OCEANBASE_JDBC_DRIVER.equals(driverClassName) || OCEANBASE_LEGACY_JDBC_DRIVER.equals(driverClassName);\n    }\n}\n","sourceCodeStart":17,"sourceCodeEnd":46,"githubUrl":"https://github.com/testcontainers/testcontainers-java/blob/8e549514e3f01c57d70546fbb8599d138f3903e5/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseJdbcUtils.java#L17-L46","documentation":"OceanBaseJdbcUtils.getDriverClass() iterates candidate OceanBase JDBC driver class names and calls Class.forName on each. If none of the candidate driver classes (MySQL-compatible or OceanBase-specific drivers) are present on the classpath, it throws a RuntimeException. The container needs a JDBC driver on the test classpath to build JDBC URLs and wait strategies.","triggerScenarios":"Creating an OceanBaseContainer / using OceanBaseJdbcUtils without any of the supported drivers (oceanbase-client, mysql-connector-java/mysql-connector-j) on the classpath.","commonSituations":"Forgetting to add the OceanBase or MySQL JDBC dependency to test scope; using a custom driver version whose class name isn't in the candidate list.","solutions":["Add com.oceanbase:oceanbase-client to the test classpath.","Alternatively add com.mysql:mysql-connector-j (or legacy mysql:mysql-connector-java), which OceanBase MySQL mode accepts.","Verify the driver jar version exposes the expected class name that OceanBaseJdbcUtils probes."],"exampleFix":"// before\ntestImplementation 'org.testcontainers:oceanbase'\n// after\ntestImplementation 'org.testcontainers:oceanbase'\ntestImplementation 'com.oceanbase:oceanbase-client:2.4.9'","handlingStrategy":"validation","validationCode":"try {\n    Class.forName(\"com.alipay.oceanbase.jdbc.Driver\");\n} catch (ClassNotFoundException e) {\n    try {\n        Class.forName(\"com.mysql.cj.jdbc.Driver\");\n    } catch (ClassNotFoundException e2) {\n        throw new IllegalStateException(\"Add oceanbase-client or mysql-connector-j to the test classpath\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    String driverClass = OceanBaseJdbcUtils.getDriverClass();\n} catch (RuntimeException e) {\n    throw new IllegalStateException(\"OceanBase JDBC driver missing from classpath\", e);\n}","preventionTips":["Always declare the OceanBase (or MySQL) JDBC driver as a test dependency alongside the testcontainers oceanbase module.","Run a classpath smoke test (Class.forName) in test setup.","Keep driver versions aligned with what OceanBaseJdbcUtils probes."],"tags":["oceanbase","jdbc","driver","classpath"],"backgroundTag":"missing-dependency","analyzedSha":"8e549514e3f01c57d70546fbb8599d138f3903e5","analyzedAt":"2026-09-12T14:56:41.227Z","contentChangedAt":"2026-09-12T14:56:41.227Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}