{"record":{"id":"d187e21d52aadf66","repo":"pentaho/pentaho-kettle","slug":"gpg-gpgfilenamenotfound","errorCode":null,"errorMessage":"GPG.GPGFilenameNotFound","messagePattern":"GPG\\.GPGFilenameNotFound","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/pgpencryptfiles/GPG.java","lineNumber":123,"sourceCode":"   * @param logInterface\n   *          LogChannelInterface\n   * @throws KettleException\n   */\n  public GPG( Bowl bowl, String gpgFilename, LogChannelInterface logInterface ) throws KettleException {\n    this.log = logInterface;\n    this.gpgexe = gpgFilename;\n    // Let's check GPG filename\n    if ( Utils.isEmpty( getGpgExeFile() ) ) {\n      // No filename specified\n      throw new KettleException( BaseMessages.getString( PKG, \"GPG.GPGFilenameMissing\" ) );\n    }\n    // We have a filename, we need to check\n    FileObject file = null;\n    try {\n      file = KettleVFS.getInstance( bowl ).getFileObject( getGpgExeFile() );\n\n      if ( !file.exists() ) {\n        throw new KettleException( BaseMessages.getString( PKG, \"GPG.GPGFilenameNotFound\" ) );\n      }\n      // The file exists\n      if ( !file.getType().equals( FileType.FILE ) ) {\n        throw new KettleException( BaseMessages.getString( PKG, \"GPG.GPGNotAFile\", getGpgExeFile() ) );\n      }\n\n      // Ok we have a real file\n      // Get the local filename\n      this.gpgexe = KettleVFS.getFilename( file );\n\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"GPG.ErrorCheckingGPGFile\", getGpgExeFile() ), e );\n    } finally {\n      try {\n        if ( file != null ) {\n          file.close();\n        }\n      } catch ( Exception e ) {","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/pgpencryptfiles/GPG.java#L105-L141","documentation":"Thrown by the GPG constructor when the configured GPG executable path resolves to a VFS FileObject that does not exist. The check happens after the filename is confirmed non-empty, validating the binary actually exists before use.","triggerScenarios":"new GPG(bowl, gpgFilename, log) where KettleVFS.getFileObject(getGpgExeFile()).exists() returns false — the path points to a missing file, or the VFS scheme/variables resolve to a non-existent location.","commonSituations":"GnuPG not installed or installed at a different path; path configured on Windows (gpg.exe) but job runs on Linux; typo in path; GPG installed via Homebrew (/opt/homebrew/bin/gpg) but config points to /usr/bin/gpg.","solutions":["Locate the real gpg binary (which gpg / where gpg) and set that exact path in the entry configuration.","Install GnuPG if absent (apt/yum/brew/Windows installer).","Check the path for typos and that any variables in it resolve correctly on the executing node.","Ensure the path is valid on the machine that actually runs the job (agents/slaves may differ from the designer machine)."],"exampleFix":"// before\nGPG gpg = new GPG( bowl, \"/usr/local/bin/gpg\", log ); // binary not there\n// after\nString gpgPath = \"/usr/bin/gpg\"; // verified with: which gpg\nGPG gpg = new GPG( bowl, gpgPath, log );","handlingStrategy":"validation","validationCode":"String gpgPath = \"/usr/bin/gpg\";\njava.io.File f = new java.io.File( gpgPath );\nif ( !f.exists() ) throw new IllegalArgumentException( \"GPG binary not found at \" + gpgPath );","typeGuard":"boolean gpgBinaryExists( String p ) { return p != null && new java.io.File( p ).isFile(); }","tryCatchPattern":"try {\n  GPG gpg = new GPG( bowl, gpgPath, log );\n} catch ( KettleException e ) {\n  if ( e.getMessage().contains( \"GPGFilenameNotFound\" ) ) {\n    logError( \"Install GnuPG or fix the configured executable path: \" + gpgPath );\n  }\n}","preventionTips":["Resolve the real binary path with 'which gpg' on each runtime host.","Install GnuPG in deployment images/containers.","Remember paths may differ between designer and slave machines.","Verify path correctness after OS or GnuPG upgrades."],"tags":["gpg","file-not-found","configuration"],"backgroundTag":"file-not-found","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"}