{"record":{"id":"5e282dbc6bfe8e02","repo":"GoogleContainerTools/jib","slug":"incomplete-extradirectories-paths-configuration-s","errorCode":null,"errorMessage":"Incomplete extraDirectories.paths configuration; source directory must be set","messagePattern":"Incomplete extraDirectories\\.paths configuration; source directory must be set","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java","lineNumber":167,"sourceCode":"  @Override\n  public Optional<String> getProperty(String propertyName) {\n    return Optional.ofNullable(System.getProperty(propertyName));\n  }\n\n  @Override\n  public String getFilesModificationTime() {\n    return jibExtension.getContainer().getFilesModificationTime().get();\n  }\n\n  @Override\n  public String getCreationTime() {\n    return jibExtension.getContainer().getCreationTime().get();\n  }\n\n  @Override\n  public List<? extends ExtraDirectoriesConfiguration> getExtraDirectories() {\n    for (ExtraDirectoryParameters path : jibExtension.getExtraDirectories().getPaths()) {\n      if (path.getFrom().equals(Paths.get(\"\"))) {\n        throw new IllegalArgumentException(\n            \"Incomplete extraDirectories.paths configuration; source directory must be set\");\n      }\n    }\n    return jibExtension.getExtraDirectories().getPaths();\n  }\n\n  @Override\n  public Map<String, FilePermissions> getExtraDirectoryPermissions() {\n    return TaskCommon.convertPermissionsMap(\n        jibExtension.getExtraDirectories().getPermissions().get());\n  }\n\n  @Override\n  public Optional<Path> getDockerExecutable() {\n    return Optional.ofNullable(jibExtension.getDockerClient().getExecutablePath());\n  }\n","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/GoogleContainerTools/jib/blob/fb949e2676afbbd7dd7a1ef61e20251931325654/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java#L149-L185","documentation":"GradleRawConfiguration.getExtraDirectories validates that every entry in `jib.extraDirectories.paths` has a non-empty source ('from') directory before Jib reads extra-directory config. A path entry equal to Paths.get(\"\") means no source directory was configured, so Jib throws IllegalArgumentException rather than silently copying nothing.","triggerScenarios":"Configuring `jib { extraDirectories { paths { path { into = '/app' } } } }` (or `path ' '`) without setting the `from`/path value, so ExtraDirectoryParameters.getFrom() resolves to the empty path; getExtraDirectories is called when building the container configuration.","commonSituations":"Copy-pasting an extraDirectories block and omitting the source path; setting only `into`; using a variable that resolves to empty string;Gradle Groovy DSL silently allowing an incomplete path block.","solutions":["Set the source directory on each path entry: `path { from = file('src/main/jib') }` or the positional `path 'src/main/jib'` form","Remove any empty path entries from extraDirectories.paths","Check for properties/variables interpolating to empty strings and give them defaults"],"exampleFix":"// before\njib.extraDirectories.paths {\n  path { into = '/app/resources' }   // 'from' missing -> Paths.get(\"\")\n}\n// after\njib.extraDirectories.paths {\n  path {\n    from = file('src/main/jib')\n    into = '/app/resources'\n  }\n}","handlingStrategy":"validation","validationCode":"def paths = project.jib.extraDirectories.paths\npaths.each { p ->\n  if (p.from == null || p.from.toString().isEmpty()) {\n    throw new GradleException(\"extraDirectories path entry missing 'from': ${p.into}\")\n  }\n  assert file(p.from).exists() : \"extra dir does not exist: ${p.from}\"\n}","typeGuard":null,"tryCatchPattern":"try {\n  jib.build()\n} catch (IllegalArgumentException e) {\n  if (e.message.contains('source directory must be set')) {\n    logger.error(\"Set 'from' on every jib.extraDirectories.paths entry\")\n  } else { throw e }\n}","preventionTips":["Always set both from (or positional path) and into on extraDirectories entries","Run `./gradlew jibConfigProperties` or print config in a check task before building","Avoid interpolating possibly-empty properties into extraDirectories paths","Keep extraDirectories blocks minimal and copy-paste tested"],"tags":["gradle","jib","configuration","extra-directories"],"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"}