{"record":{"id":"03145dc265c04976","repo":"apache/pulsar","slug":"function-class-name-is-not-provided","errorCode":null,"errorMessage":"Function class name is not provided.","messagePattern":"Function class name is not provided\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java","lineNumber":637,"sourceCode":"        if (windowConfig != null) {\n            WindowConfigUtils.inferMissingArguments(windowConfig);\n            functionConfig.setAutoAck(false);\n        }\n    }\n\n    public static ExtractedFunctionDetails doJavaChecks(FunctionConfig functionConfig,\n                                                        ValidatableFunctionPackage validatableFunctionPackage) {\n\n        String functionClassName = StringUtils.trimToNull(functionConfig.getClassName());\n        TypeDefinition functionClass;\n        try {\n            // if class name in function config is not set, this should be a built-in function\n            // thus we should try to find its class name in the NAR service definition\n            if (functionClassName == null) {\n                FunctionDefinition functionDefinition =\n                        validatableFunctionPackage.getFunctionMetaData(FunctionDefinition.class);\n                if (functionDefinition == null) {\n                    throw new IllegalArgumentException(\"Function class name is not provided.\");\n                }\n                functionClassName = functionDefinition.getFunctionClass();\n                if (functionClassName == null) {\n                    throw new IllegalArgumentException(\"Function class name is not provided.\");\n                }\n            }\n            functionClass = validatableFunctionPackage.resolveType(functionClassName);\n\n            if (!functionClass.asErasure().isAssignableTo(org.apache.pulsar.functions.api.Function.class)\n                    && !functionClass.asErasure().isAssignableTo(java.util.function.Function.class)\n                    && !functionClass.asErasure()\n                    .isAssignableTo(org.apache.pulsar.functions.api.WindowFunction.class)) {\n                throw new IllegalArgumentException(\n                        String.format(\"Function class %s does not implement the correct interface\",\n                                functionClassName));\n            }\n        } catch (TypePool.Resolution.NoSuchTypeException e) {\n            throw new IllegalArgumentException(","sourceCodeStart":619,"sourceCodeEnd":655,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java#L619-L655","documentation":"The Java function validation (doJavaChecks) could not determine the function's implementing class. If className is not set on the FunctionConfig, the validator tries to read a FunctionDefinition from the NAR package archive; if neither the config nor the NAR metadata provides a class name, IllegalArgumentException is thrown.","triggerScenarios":"Submitting a Java function with FunctionConfig.className unset whose package is not a valid NAR containing a FunctionDefinition (e.g. a plain JAR), or a NAR whose ServiceLoader metadata file is missing/empty.","commonSituations":"Building a function JAR instead of a NAR without setting className; malformed NAR missing META-INF/services/pulsar-function-definition; typo leaving className null in the YAML/JSON config.","solutions":["Set className in the FunctionConfig to the fully qualified function class","If using a NAR, ensure it contains a valid function definition service file (FunctionDefinition metadata)","Rebuild/repackage the function archive so the class is discoverable"],"exampleFix":"// before\nFunctionConfig config = new FunctionConfig();\nconfig.setRuntime(FunctionConfig.Runtime.JAVA);\n// after\nconfig.setClassName(\"org.example.MyFunction\");","handlingStrategy":"validation","validationCode":"if (config.getClassName() == null && !isNarPackage(functionPackage)) { throw new IllegalArgumentException(\"Java functions need className set or a NAR package with FunctionDefinition\"); }","typeGuard":"boolean hasClassName(FunctionConfig c) { return c.getClassName() != null && !c.getClassName().isEmpty(); }","tryCatchPattern":"try { FunctionConfigUtils.validateJavaFunction(...); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"class name\")) { /* prompt user for className */ } }","preventionTips":["Always set className explicitly for JAR-packaged functions","Verify NAR packages contain META-INF/services function definition metadata","Validate function configs in CI before submission"],"tags":["pulsar","functions","java","configuration"],"backgroundTag":"missing-function-class-name","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}