NoClassDefFoundError is a runtime error in Java that occurs if the Java Virtual Machine (JVM) or a
ClassLoader instance attempts to load the definition of a class that could not be found. The class definition exists at compile-time but is not available at runtime.
The definition of the class is attempted to be loaded as part of a normal method call or creating an instance of the class using the
new expression and no definition of the class could be found. Therefore, it can occur during the linking or loading of the unavailable class.
Common causes of the class definition being unavailable at runtime and solutions to try:
- Missing JAR file: First, identify the JAR file that contains the class for which you are receiving the NoClassDefFoundError. Once identified, verify if the JAR file exists in the installation directory structure of the StreamSets engine. Alternatively, check if it is located in other paths referenced by the data plane engine (e.g., the USER_LIBRARIES_DIR variable, which holds the path to custom libraries). For example, if the error message is "java.lang.NoClassDefFoundError: com/zaxxer/hikari/HikariConfig," it suggests that the HikariConfig class from the HikariCP* JAR file is missing. In this case, confirm if the HikariCP* JAR file is present in the specified paths.
- Permission issues: If jar in concern exists, see if the jar has read permissions by the engine process.
- Incorrect classpath at runtime: If that JAR is already present in the classpath, make sure the classpath is not overridden. Let’s say if you have a pipeline with stage snowflake and is failing with java.lang.NoClassDefFoundError: com/zaxxer/hikari/HikariConfig, you can try jcmd <pid> VM.class_hierarchy on DPE instance to see the classes loaded. Or you could pass -verbose:class as your DPE’s jvm arg and look for the classes loaded in respective stdout files.
By addressing these potential causes and following the outlined solutions, you can try mitigate the NoClassDefFoundError in Java.