{"record":{"id":"2776c09c120a69a6","repo":"pentaho/pentaho-kettle","slug":"gpg-gpgfilenamemissing","errorCode":null,"errorMessage":"GPG.GPGFilenameMissing","messagePattern":"GPG\\.GPGFilenameMissing","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/pgpencryptfiles/GPG.java","lineNumber":115,"sourceCode":"    }\n  }\n\n  /**\n   * Constructs a new GnuPG\n   *\n   * @param gpgFilename\n   *          gpg program location\n   * @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","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/pgpencryptfiles/GPG.java#L97-L133","documentation":"Thrown by the GPG constructor when the configured gpg executable filename is empty or null. The GPG helper refuses to operate without a path to the GnuPG binary, failing fast before attempting any process execution.","triggerScenarios":"new GPG(bowl, gpgFilename, log) is called with an empty string or null gpgFilename — Utils.isEmpty(getGpgExeFile()) is true. Typically when JobEntryPGPEncryptFiles' 'GnuPG home / executable' setting was never filled in.","commonSituations":"Fresh job entry where the GPG executable field was left blank; environment variable or Kettle variable holding the path resolved to empty; config copied between environments where the path setting was lost.","solutions":["Set the GnuPG executable location (e.g. /usr/bin/gpg or C:\\Program Files\\GnuPG\\bin\\gpg.exe) in the job entry settings.","Verify the Kettle/environment variable used for the path resolves to a non-empty value at runtime.","Install GnuPG if it is not present, then configure the path."],"exampleFix":"// before\nGPG gpg = new GPG( bowl, \"\", log ); // empty path\n// after\nString gpgPath = \"/usr/bin/gpg\"; // or resolve from settings/variable\nif ( gpgPath != null && !gpgPath.isEmpty() ) {\n  GPG gpg = new GPG( bowl, gpgPath, log );\n}","handlingStrategy":"validation","validationCode":"String gpgPath = resolveGpgPath(); // from settings/variable\nif ( gpgPath == null || gpgPath.trim().isEmpty() ) {\n  throw new IllegalArgumentException( \"GPG executable path must be configured\" );\n}","typeGuard":"boolean gpgPathPresent( String p ) { return p != null && !p.trim().isEmpty(); }","tryCatchPattern":"try {\n  GPG gpg = new GPG( bowl, gpgPath, log );\n} catch ( KettleException e ) {\n  if ( e.getMessage().contains( \"GPGFilenameMissing\" ) ) {\n    logError( \"Configure the GnuPG executable path in the job entry settings\" );\n  }\n}","preventionTips":["Always set the GPG executable path in entry configuration.","Validate environment variables resolve before running jobs.","Document required GPG config per environment.","Fail fast in job setup when required settings are blank."],"tags":["gpg","configuration","missing-argument"],"backgroundTag":"missing-required-config-field","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"}