apache/iceberg · warning
Failed to load version properties from
Error message
Failed to load version properties from {} What it means
IcebergBuild.loadBuildInfo() reads /iceberg-build.properties from the classpath to populate build metadata (git commit, branch, version). If the resource is missing or unreadable, it logs this warning and falls back to 'unknown' for all fields; it never throws. The library emits it so operators know runtime version reporting (e.g. in logs and diagnostics) is degraded.
Solutions
- Verify iceberg-build.properties exists at the jar root of the iceberg-api jar on the classpath (unzip -l iceberg-api-*.jar | grep iceberg-build.properties).
- Use official, unmodified Iceberg release artifacts instead of manually repackaged jars, or ensure your shading config (e.g. Maven Shade) does not exclude .properties resources.
- Run a full Gradle build (or use published artifacts) so the build-info resource is generated rather than compiling the module alone in an IDE.
- If the warning is cosmetic in a controlled deployment, it can be safely ignored — the library continues with 'unknown' version strings.
Example fix
// before (maven-shade-plugin) <filters> <filter><artifact>*:*</artifact><excludes><exclude>*.properties</exclude></excludes></filter> </filters> // after <filters> <filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude></excludes></filter> </filters>
Defensive patterns
Strategy: validation
Validate before calling
// Check the resource is on the classpath before relying on build metadata
boolean present = IcebergBuild.class.getResource("/iceberg-build.properties") != null;
if (!present) {
LOG.warn("iceberg-build.properties missing from classpath; version reporting will be 'unknown'");
} Prevention
- Use official Iceberg artifacts; don't strip .properties files when shading.
- Verify jar contents after packaging (unzip -l | grep iceberg-build.properties).
- Prefer full Gradle builds over IDE-only compilation for deployable artifacts.
- Remember the accessor methods never throw — treat 'unknown' values as a classpath packaging signal.
When it happens
Trigger: Calling any IcebergBuild static accessor (version(), fullVersion(), gitCommitId(), etc.) triggers ensureLoaded() -> loadBuildInfo(), which warns when /iceberg-build.properties is absent from the classpath or its InputStream fails to load (e.g. corrupted jar, classloader shading stripped the resource).
Common situations: Shading/relocating Iceberg jars without including resource files; fat jars built with resource filtering that excludes .properties; running a repackaged or IDE-compiled build where the build-time resource generation step was skipped; custom classloaders that don't see the resource in the Iceberg jar.
Understand the failure class
Background: "Config file not found": what it means and how to fix it in docker-sync, Maven, Vagrant, Turborepo and other tools — this error's family across 60 libraries.
Related errors
- Could not deserialize the WriteResult object
- ALTER VIEW AS is not supported. Use CREATE OR REPLACE VIEW…
- apply(value) is deprecated, use bind(Type).apply(value)
- apply(value) is deprecated, use bind(Type).apply(value)
- AS OF is not supported for changelogs
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/4291e74abc3bb072.
Report an issue: GitHub.
Appendix: source
Thrown at api/src/main/java/org/apache/iceberg/IcebergBuild.java:54
private static final String VERSION_PROPERTIES_FILE = "/iceberg-build.properties";
private static final String UNKNOWN_DEFAULT = "unknown";
private static volatile boolean isLoaded = false;
private static String shortId; // 10 character short git hash of the build
private static String commitId; // 40 character full git hash of the build
private static String branch;
private static List<String> tags;
private static String version;
private static String fullVersion;
/** Loads the version.properties file for this module. */
public static void loadBuildInfo() {
Properties buildProperties = new Properties();
try (InputStream is = readResource(VERSION_PROPERTIES_FILE)) {
buildProperties.load(is);
} catch (Exception e) {
LOG.warn("Failed to load version properties from {}", VERSION_PROPERTIES_FILE, e);
}
IcebergBuild.shortId = buildProperties.getProperty("git.commit.id.abbrev", UNKNOWN_DEFAULT);
IcebergBuild.commitId = buildProperties.getProperty("git.commit.id", UNKNOWN_DEFAULT);
IcebergBuild.branch = buildProperties.getProperty("git.branch", UNKNOWN_DEFAULT);
String tagList = buildProperties.getProperty("git.tags", "");
if (!tagList.isEmpty()) {
IcebergBuild.tags = ImmutableList.copyOf(Splitter.on(",").split(tagList));
} else {
IcebergBuild.tags = ImmutableList.of();
}
IcebergBuild.version = buildProperties.getProperty("git.build.version", UNKNOWN_DEFAULT);
IcebergBuild.fullVersion = String.format("Apache Iceberg %s (commit %s)", version, commitId);
}
public static String gitCommitId() {
ensureLoaded();
return commitId;View on GitHub (pinned to 86d9c8fc54)