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
- 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
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
- 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
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
- container.appRoot is not an absolute Unix-style path: ${inva
- invalid value for containerizingMode: ${invalidContainerizin
- container.workingDirectory is not an absolute Unix-style pat
- from.platforms contains a platform configuration that is mis
- container.volumes is not an absolute Unix-style path: ${inva
AI-assisted analysis of GoogleContainerTools/jib@fb949e2676 (2026-09-06).
Data as JSON: /api/errors/5e282dbc6bfe8e02.
Report an issue: GitHub.