{"record":{"id":"a1090b235cafe16f","repo":"GoogleContainerTools/jib","slug":"incomplete-permission-configuration-requires-f","errorCode":null,"errorMessage":"Incomplete <permission> configuration; requires <file> and <mode> fields to be set","messagePattern":"Incomplete <permission> configuration; requires <file> and <mode> fields to be set","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MojoCommon.java","lineNumber":144,"sourceCode":"            \"/\"));\n  }\n\n  /**\n   * Converts a list of {@link PermissionConfiguration} to an equivalent {@code\n   * String->FilePermission} map.\n   *\n   * @param permissionList the list to convert\n   * @return the resulting map\n   */\n  static Map<String, FilePermissions> convertPermissionsList(\n      List<PermissionConfiguration> permissionList) {\n    // Order is important, so use a LinkedHashMap\n    Map<String, FilePermissions> permissionsMap = new LinkedHashMap<>();\n    for (PermissionConfiguration permission : permissionList) {\n      Optional<String> file = permission.getFile();\n      Optional<String> mode = permission.getMode();\n      if (!file.isPresent() || !mode.isPresent()) {\n        throw new IllegalArgumentException(\n            \"Incomplete <permission> configuration; requires <file> and <mode> fields to be set\");\n      }\n      permissionsMap.put(file.get(), FilePermissions.fromOctalString(mode.get()));\n    }\n    return permissionsMap;\n  }\n\n  /**\n   * Check that the actual version satisfies required Jib version range when specified. No check is\n   * performed if the provided Jib version is {@code null}, which should only occur during debug.\n   *\n   * @param descriptor the plugin version\n   * @throws MojoExecutionException if the version is not acceptable\n   */\n  public static void checkJibVersion(PluginDescriptor descriptor) throws MojoExecutionException {\n    String acceptableVersionSpec = System.getProperty(MojoCommon.REQUIRED_VERSION_PROPERTY_NAME);\n    if (acceptableVersionSpec == null) {\n      return;","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/GoogleContainerTools/jib/blob/fb949e2676afbbd7dd7a1ef61e20251931325654/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MojoCommon.java#L126-L162","documentation":"A <permission> entry in the extra directories configuration is missing either its <file> or <mode> field. MojoCommon.convertPermissionsList requires both to be present and throws IllegalArgumentException otherwise, since a permission without a target file or an octal mode is meaningless.","triggerScenarios":"Declaring <extraDirectories><permissions><permission><file>/app/run.sh</file></permission></permissions></extraDirectories> without <mode>, or with <mode> but no <file>, or an empty <permission> element.","commonSituations":"Hand-editing pom.xml and deleting one of the two fields; property-driven generation leaving a field blank when a Maven property is unset; misunderstanding that both fields are mandatory per permission entry.","solutions":["Provide both fields in every <permission>: <permission><file>/path/in/container</file><mode>755</mode></permission>.","Ensure <mode> is a valid octal string (e.g. 644, 755) — set it if it was accidentally cleared.","Check that Maven properties used inside <file>/<mode> resolve to non-empty values in the active build profile.","Remove empty leftover <permission> elements from previous edits."],"exampleFix":"<!-- before -->\n<permissions>\n  <permission><file>/app/start.sh</file></permission>\n</permissions>\n\n<!-- after -->\n<permissions>\n  <permission>\n    <file>/app/start.sh</file>\n    <mode>755</mode>\n  </permission>\n</permissions>","handlingStrategy":"validation","validationCode":"// Pre-validate permissions entries:\n// each <permission> needs both <file> and <mode>\n// e.g. xmllint --xpath '//permission[file and mode]' pom.xml || echo 'permission missing file or mode'","typeGuard":null,"tryCatchPattern":"try {\n  // jib build\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().contains(\"requires <file> and <mode> fields\")) {\n    // fill in the missing <file> or <mode> on the offending <permission>\n  }\n  throw e;\n}","preventionTips":["Always write both <file> and <mode> in every <permission> entry.","Use valid octal mode strings (3-4 digits: 644, 0755).","If generating pom from templates, assert that file/mode properties are non-empty.","Prune empty <permission> stubs after editing the extraDirectories config."],"tags":["jib","maven","pom-configuration","permissions"],"backgroundTag":"missing-required-config-field","analyzedSha":"fb949e2676afbbd7dd7a1ef61e20251931325654","analyzedAt":"2026-09-06T14:04:09.491Z","contentChangedAt":"2026-09-06T14:04:09.491Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}