{"record":{"id":"6747c6c6f229307b","repo":"pentaho/pentaho-kettle","slug":"resourceutil-exception-noresourcesfoundtoexport","errorCode":"ResourceUtil.Exception.NoResourcesFoundToExport","errorMessage":"ResourceUtil.Exception.NoResourcesFoundToExport","messagePattern":"ResourceUtil\\.Exception\\.NoResourcesFoundToExport","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/resource/ResourceUtil.java","lineNumber":144,"sourceCode":"          String filename = entry.getKey();\n          ResourceDefinition resourceDefinition = entry.getValue();\n\n          ZipEntry zipEntry = new ZipEntry( resourceDefinition.getFilename() );\n\n          String comment =\n            BaseMessages.getString(\n              PKG, \"ResourceUtil.SerializeResourceExportInterface.ZipEntryComment.OriginatingFile\", filename,\n              Const.NVL( resourceDefinition.getOrigin(), \"-\" ) );\n          zipEntry.setComment( comment );\n          out.putNextEntry( zipEntry );\n\n          out.write( resourceDefinition.getContent().getBytes() );\n          out.closeEntry();\n        }\n        String zipURL = fileObject.getName().toString();\n        return new TopLevelResource( topLevelResource, zipURL, \"zip:\" + zipURL + \"!\" + topLevelResource );\n      } else {\n        throw new KettleException( BaseMessages.getString( PKG, \"ResourceUtil.Exception.NoResourcesFoundToExport\" ) );\n      }\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"ResourceUtil.Exception.ErrorSerializingExportInterface\", resourceExportInterface.toString() ), e );\n    } finally {\n      if ( out != null ) {\n        try {\n          out.close();\n        } catch ( IOException e ) {\n          throw new KettleException( BaseMessages.getString(\n            PKG, \"ResourceUtil.Exception.ErrorClosingZipStream\", zipFilename ) );\n        }\n      }\n    }\n  }\n\n  public static String getExplanation( String zipFilename, String launchFile,\n    ResourceExportInterface resourceExportInterface ) {","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/resource/ResourceUtil.java#L126-L162","documentation":"ResourceUtil.serializeResourceExportInterface throws this KettleException when the export produced no resources to package: the resource list was empty so there is nothing to zip into the export file. The message comes from the message bundle key ResourceUtil.Exception.NoResourcesFoundToExport.","triggerScenarios":"Calling serializeResourceExportInterface on an object whose buildResourceNames/ResourceReference list resolves to zero resource entries (no files registered for export), causing the else branch after the resource-writing loop.","commonSituations":"Exporting a job/transformation that references no external files; resource export settings (original files vs. zip) misconfigured so nothing is registered; programmatically exporting an object before it loaded its referenced resources.","solutions":["Ensure the job/transformation actually references resources (set file paths so ResourceReference entries are produced)","Check the export type/ResourceExportInterface implementation registers resources before serialization","Verify resource-related transformation settings (e.g. 'Copy or distribute files' / export options) are not suppressing resource collection","Handle the empty-resource case by exporting the file as-is instead of zipping"],"exampleFix":"// before\nTopLevelResource res = ResourceUtil.serializeResourceExportInterface(zipFilename, exportable, transMeta);\n// after\nList<ResourceReference> refs = exportable.getResourceDependencies(transMeta);\nif (refs.isEmpty()) {\n  LOG.warn(\"No resources to export; writing file directly\");\n} else {\n  TopLevelResource res = ResourceUtil.serializeResourceExportInterface(zipFilename, exportable, transMeta);\n}","handlingStrategy":"validation","validationCode":"List<ResourceReference> refs = exportable.getResourceDependencies(transMeta);\nif (refs == null || refs.isEmpty()) {\n  LOG.warn(\"No resources to export; skipping zip export\");\n  return null;\n}","typeGuard":null,"tryCatchPattern":"try {\n  return ResourceUtil.serializeResourceExportInterface(zipFilename, exportable, transMeta);\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"NoResourcesFound\")) {\n    return null; // nothing to export\n  }\n  throw e;\n}","preventionTips":["Ensure the transformation/job registers its referenced files as resources","Check export resource settings are not suppressing resource collection","Pre-check resource dependencies before serializing","Handle null/empty export results explicitly"],"tags":["export","resources","zip","kettle"],"backgroundTag":"empty-result-set","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}