GoogleContainerTools/jib · error · IllegalArgumentException

Incomplete extraDirectories.paths configuration; source dire

Error message

Incomplete extraDirectories.paths configuration; source directory must be set

What it means

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.

Source

Thrown at jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java:167

  @Override
  public Optional<String> getProperty(String propertyName) {
    return Optional.ofNullable(System.getProperty(propertyName));
  }

  @Override
  public String getFilesModificationTime() {
    return jibExtension.getContainer().getFilesModificationTime().get();
  }

  @Override
  public String getCreationTime() {
    return jibExtension.getContainer().getCreationTime().get();
  }

  @Override
  public List<? extends ExtraDirectoriesConfiguration> getExtraDirectories() {
    for (ExtraDirectoryParameters path : jibExtension.getExtraDirectories().getPaths()) {
      if (path.getFrom().equals(Paths.get(""))) {
        throw new IllegalArgumentException(
            "Incomplete extraDirectories.paths configuration; source directory must be set");
      }
    }
    return jibExtension.getExtraDirectories().getPaths();
  }

  @Override
  public Map<String, FilePermissions> getExtraDirectoryPermissions() {
    return TaskCommon.convertPermissionsMap(
        jibExtension.getExtraDirectories().getPermissions().get());
  }

  @Override
  public Optional<Path> getDockerExecutable() {
    return Optional.ofNullable(jibExtension.getDockerClient().getExecutablePath());
  }

View on GitHub (pinned to fb949e2676)

Solutions

  1. Set the source directory on each path entry: `path { from = file('src/main/jib') }` or the positional `path 'src/main/jib'` form
  2. Remove any empty path entries from extraDirectories.paths
  3. Check for properties/variables interpolating to empty strings and give them defaults

Example fix

// before
jib.extraDirectories.paths {
  path { into = '/app/resources' }   // 'from' missing -> Paths.get("")
}
// after
jib.extraDirectories.paths {
  path {
    from = file('src/main/jib')
    into = '/app/resources'
  }
}
Defensive patterns

Strategy: validation

Validate before calling

def paths = project.jib.extraDirectories.paths
paths.each { p ->
  if (p.from == null || p.from.toString().isEmpty()) {
    throw new GradleException("extraDirectories path entry missing 'from': ${p.into}")
  }
  assert file(p.from).exists() : "extra dir does not exist: ${p.from}"
}

Try / catch

try {
  jib.build()
} catch (IllegalArgumentException e) {
  if (e.message.contains('source directory must be set')) {
    logger.error("Set 'from' on every jib.extraDirectories.paths entry")
  } else { throw e }
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of GoogleContainerTools/jib@fb949e2676 (2026-09-06). Data as JSON: /api/errors/5e282dbc6bfe8e02. Report an issue: GitHub.