{"record":{"id":"b12a21a08ddd2ce2","repo":"elastic/elasticsearch","slug":"unable-to-parse-bundled-jdk-version","errorCode":null,"errorMessage":"Unable to parse bundled JDK version {}","messagePattern":"Unable to parse bundled JDK version (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/toolchain/OracleOpenJdkToolchainResolver.java","lineNumber":80,"sourceCode":"        \"(\\\\d+)(\\\\.\\\\d+\\\\.\\\\d+(?:\\\\.\\\\d+)?)?\\\\+(\\\\d+(?:\\\\.\\\\d+)?)(@([a-f0-9]{32}))?\"\n    );\n\n    private static final List<OperatingSystem> supportedOperatingSystems = List.of(\n        OperatingSystem.MAC_OS,\n        OperatingSystem.LINUX,\n        OperatingSystem.WINDOWS\n    );\n\n    // package private so it can be replaced by tests\n    List<JdkBuild> builds = List.of(\n        getBundledJdkBuild(VersionProperties.getBundledJdkVersion(), VersionProperties.getBundledJdkMajorVersion())\n    );\n\n    static JdkBuild getBundledJdkBuild(String bundledJdkVersion, String bundledJkdMajorVersionString) {\n        JavaLanguageVersion bundledJdkMajorVersion = JavaLanguageVersion.of(bundledJkdMajorVersionString);\n        Matcher jdkVersionMatcher = VERSION_PATTERN.matcher(bundledJdkVersion);\n        if (jdkVersionMatcher.matches() == false) {\n            throw new IllegalStateException(\"Unable to parse bundled JDK version \" + bundledJdkVersion);\n        }\n        String baseVersion = jdkVersionMatcher.group(1) + (jdkVersionMatcher.group(2) != null ? (jdkVersionMatcher.group(2)) : \"\");\n        String build = jdkVersionMatcher.group(3);\n        String hash = jdkVersionMatcher.group(5);\n        return new ReleaseJdkBuild(bundledJdkMajorVersion, \"download.oracle.com\", baseVersion, build, hash);\n    }\n\n    /**\n     * We need some place to map JavaLanguageVersion to buildNumber, minor version etc.\n     * */\n    @Override\n    public Optional<JavaToolchainDownload> resolve(JavaToolchainRequest request) {\n        JdkBuild build = findSupportedBuild(request);\n        if (build == null) {\n            return Optional.empty();\n        }\n\n        OperatingSystem operatingSystem = request.getBuildPlatform().getOperatingSystem();","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/toolchain/OracleOpenJdkToolchainResolver.java#L62-L98","documentation":"IllegalStateException thrown when VersionProperties.getBundledJdkVersion() does not match VERSION_PATTERN: (\\d+)(\\.\\d+\\.\\d+(?:\\.\\d+)?)?\\+(\\d+(?:\\.\\d+)?)(@([a-f0-9]{32}))?. The pattern expects a JDK semver-style string with a mandatory +build (and optional @hash) suffix used to build the Oracle download URL.","triggerScenarios":"build-tools-internal's VersionProperties (typically fed from buildSrcVersion.properties or a gradle property) contains a bundled JDK version string lacking the +buildNumber suffix, using a different separator, or missing components.","commonSituations":"Bumping the bundled JDK and forgetting the build metadata suffix (e.g. setting '25' instead of '25.0.1+12'); a version-rectification script producing a stripped string; merging version properties with conflicting formats.","solutions":["Check the value of VersionProperties.getBundledJdkVersion() and compare against VERSION_PATTERN.","Reformat the bundled JDK version to match '<major>[.<minor>.<patch>[.<update>]]+<build>[@<hash>]' (e.g. '25.0.1+12@abcdef0123456789abcdef0123456789').","Update the property source (version.properties / gradle -P flag) consistently across the build."],"exampleFix":"// before: bundledJdkVersion = \"25\"\n// after:  bundledJdkVersion = \"25.0.1+12\"","handlingStrategy":"validation","validationCode":"private static final Pattern VERSION_PATTERN =\n    Pattern.compile(\"(\\\\d+)(\\\\.\\\\d+\\\\.\\\\d+(?:\\\\.\\\\d+)?)?\\\\+(\\\\d+(?:\\\\.\\\\d+)?)(@([a-f0-9]{32}))?\");\n\nstatic boolean isValidBundledJdkVersion(String v) {\n    return v != null && VERSION_PATTERN.matcher(v).matches();\n}\n\n// usage before assigning VersionProperties\nif (!isValidBundledJdkVersion(candidate)) {\n    throw new IllegalArgumentException(\"Bundled JDK version must match \" + VERSION_PATTERN + \": \" + candidate);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include the +build suffix when setting the bundled JDK version property.","Add a build-time sanity check that validates the version string format.","Keep version-property updates in a single source of truth."],"tags":["jdk","toolchain","version-parsing","build-tooling"],"backgroundTag":null,"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}