{"record":{"id":"abf527848f84f92b","repo":"apache/seatunnel","slug":"not-found-jar","errorCode":"NOT_FOUND_JAR","errorMessage":"The jar file %s can not be found in node %s, please ensure that the deployment paths of SeaTunnel on different nodes are consistent.","messagePattern":"The jar file (.+?) can not be found in node (.+?), please ensure that the deployment paths of SeaTunnel on different nodes are consistent\\.","errorType":"exception","errorClass":"ClassLoaderException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/classloader/DefaultClassLoaderService.java","lineNumber":82,"sourceCode":"        if (!classLoaderCache.containsKey(jobId)) {\n            classLoaderCache.put(jobId, new ConcurrentHashMap<>());\n            classLoaderReferenceCount.put(jobId, new ConcurrentHashMap<>());\n        }\n        Map<String, ClassLoader> classLoaderMap = classLoaderCache.get(jobId);\n        String key = covertJarsToKey(jars);\n        if (classLoaderMap.containsKey(key)) {\n            classLoaderReferenceCount.get(jobId).get(key).incrementAndGet();\n            return classLoaderMap.get(key);\n        } else {\n            if (Objects.nonNull(nodeEngine)\n                    && !Boolean.parseBoolean(\n                            System.getenv().getOrDefault(SKIP_CHECK_JAR, \"false\"))) {\n                for (URL jar : jars) {\n                    File file = new File(jar.toURI().getPath());\n                    if (!file.exists()) {\n                        String host =\n                                ((NodeEngineImpl) nodeEngine).getNode().getThisAddress().getHost();\n                        throw new ClassLoaderException(\n                                ClassLoaderErrorCode.NOT_FOUND_JAR,\n                                \"The jar file \"\n                                        + jar\n                                        + \" can not be found in node \"\n                                        + host\n                                        + \", please ensure that the deployment paths of SeaTunnel on different nodes are consistent.\");\n                    }\n                }\n            } else {\n                log.debug(\"Run the test class without file checking\");\n            }\n            ClassLoader classLoader = new SeaTunnelChildFirstClassLoader(jars);\n            log.info(\"Create classloader for job {} with jars {}\", jobId, jars);\n            classLoaderMap.put(key, classLoader);\n            classLoaderReferenceCount.get(jobId).put(key, new AtomicInteger(1));\n            return classLoader;\n        }\n    }","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/classloader/DefaultClassLoaderService.java#L64-L100","documentation":"DefaultClassLoaderService.getClassLoader validates that each jar URL referenced by a job's connector-jar list physically exists on the node before building a class loader, throwing ClassLoaderException with code NOT_FOUND_JAR when a file is missing. Because Zeta runs on multiple nodes, it checks the local node and hints that SeaTunnel deployment paths must be consistent across the cluster.","triggerScenarios":"Submitting a job with jar URLs (connector jar add/delete API or 'jar' config) whose paths don't exist on some/all Zeta nodes — typically during testPreCheckJar of a job that references connectors by absolute path.","commonSituations":"SeaTunnel installed at different paths on different cluster nodes; jar uploaded to only the node receiving the submit request; typo or wrong user/home directory in the jar path; NFS/storage not mounted on a worker.","solutions":["Ensure the referenced jar exists at the exact same absolute path on every Zeta node (install SeaTunnel under an identical path cluster-wide).","Re-upload the connector jar via the addConnectorJar API so the engine distributes it instead of referencing a local file path.","Verify each node's SEATUNNEL_HOME and shared-storage mounts, or set skip-check-jar env (SKIP_CHECK_JAR=true) only as a temporary diagnostic workaround.","Correct the jar path in the job configuration to point at a real file (ls the path on each node to confirm)."],"exampleFix":"// before\nString jarPath = \"/home/alice/seatunnel/connectors/connector-jdbc-2.3.8.jar\";\n// after\nString jarPath = \"/opt/seatunnel/connectors/connector-jdbc-2.3.8.jar\"; // same on all nodes","handlingStrategy":"validation","validationCode":"for (URL jar : jars) {\n    if (!new File(jar.toURI().getPath()).exists())\n        throw new IllegalStateException(\"jar missing on this node: \" + jar);\n}\n// additionally verify on every worker via ssh: test -f <path>","typeGuard":null,"tryCatchPattern":"try { jobClient.executeJob(); } catch (ClassLoaderException e) { if (e.getErrorCode() == ClassLoaderErrorCode.NOT_FOUND_JAR) { /* redeploy jar to all nodes or use addConnectorJar */ } throw e; }","preventionTips":["Install SeaTunnel at an identical absolute path on every cluster node.","Prefer the addConnectorJar upload API over referencing local file paths.","Confirm shared filesystems are mounted on all workers before submitting."],"tags":["classloader","jar","cluster","zeta-engine"],"backgroundTag":"file-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}