From 57077f423d2ae845a158d644557ed013d9c8ae54 Mon Sep 17 00:00:00 2001 From: Peter Paul Bakker Date: Wed, 13 May 2026 06:25:59 +0000 Subject: [PATCH] fix: fall back to default JRE version when only memory_calculator is set When JBP_CONFIG_*_JRE contains only memory_calculator settings (no version), GetJREVersion() was hard-failing with 'could not parse version'. Now: if parseJBPConfigVersion returns empty string, log debug and fall through to manifest default version. Fixes: https://github.com/stokpop/java-buildpack/issues/1270 --- src/java/jres/jre.go | 43 +++++++++++++++++++++------------------ src/java/jres/jre_test.go | 21 ++++++++++++++----- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/java/jres/jre.go b/src/java/jres/jre.go index 5cd252a14..41bee407f 100644 --- a/src/java/jres/jre.go +++ b/src/java/jres/jre.go @@ -195,7 +195,7 @@ type BaseComponent struct { // DetectJREByEnv checks environment variables for JRE selection // Takes the internal JRE name (e.g., "sapmachine", "openjdk", "zulu") // Checks both auto-generated and documented environment variable names -// This matches the behavior of GetJREVersion and the Ruby buildpack +// This matches the behavior of GetJREVersion func DetectJREByEnv(jreName string) bool { // Check auto-generated name pattern (e.g., JBP_CONFIG_SAPMACHINE) envKey := fmt.Sprintf("JBP_CONFIG_%s", strings.ToUpper(strings.ReplaceAll(jreName, "-", "_"))) @@ -275,27 +275,30 @@ func GetJREVersion(ctx *common.Context, jreName string) (libbuildpack.Dependency versionPattern := parseJBPConfigVersion(envVal) if versionPattern == "" { - return libbuildpack.Dependency{}, fmt.Errorf("could not parse version from %s='%s'", envKey, envVal) - } - ctx.Log.Debug("Parsed version pattern from %s: '%s'", envKey, versionPattern) - - normalizedPattern := normalizeVersionPattern(versionPattern) - ctx.Log.Debug("Normalized pattern: '%s' -> '%s'", versionPattern, normalizedPattern) + // No version specified — env var is used for other settings (e.g. memory_calculator). + // Fall back to manifest default. + ctx.Log.Debug("%s set but contains no version field, using manifest default", envKey) + } else { + ctx.Log.Debug("Parsed version pattern from %s: '%s'", envKey, versionPattern) + + normalizedPattern := normalizeVersionPattern(versionPattern) + ctx.Log.Debug("Normalized pattern: '%s' -> '%s'", versionPattern, normalizedPattern) + + availableVersions := ctx.Manifest.AllDependencyVersions(jreName) + if len(availableVersions) == 0 { + return libbuildpack.Dependency{}, fmt.Errorf("no versions of %s found in manifest", jreName) + } + ctx.Log.Debug("Available versions for %s: %v", jreName, availableVersions) - availableVersions := ctx.Manifest.AllDependencyVersions(jreName) - if len(availableVersions) == 0 { - return libbuildpack.Dependency{}, fmt.Errorf("no versions of %s found in manifest", jreName) - } - ctx.Log.Debug("Available versions for %s: %v", jreName, availableVersions) + matchedVersion, err := libbuildpack.FindMatchingVersion(normalizedPattern, availableVersions) + if err != nil { + ctx.Log.Debug("FindMatchingVersion failed: %s", err.Error()) + return libbuildpack.Dependency{}, fmt.Errorf("no version of %s matching '%s' found in manifest. Available versions: %v", jreName, versionPattern, availableVersions) + } + ctx.Log.Debug("Matched version: %s", matchedVersion) - matchedVersion, err := libbuildpack.FindMatchingVersion(normalizedPattern, availableVersions) - if err != nil { - ctx.Log.Debug("FindMatchingVersion failed: %s", err.Error()) - return libbuildpack.Dependency{}, fmt.Errorf("no version of %s matching '%s' found in manifest. Available versions: %v", jreName, versionPattern, availableVersions) + return libbuildpack.Dependency{Name: jreName, Version: matchedVersion}, nil } - ctx.Log.Debug("Matched version: %s", matchedVersion) - - return libbuildpack.Dependency{Name: jreName, Version: matchedVersion}, nil } // Get default version from manifest (no version constraint) @@ -397,7 +400,7 @@ func WriteJavaHomeProfileD(ctx *common.Context, jreDir, javaHome string) error { } // Create the profile.d script content with JAVA_HOME, JRE_HOME, and PATH - // Following the pattern from reference buildpacks (Ruby, Python, Go) + // Create the profile.d script content with JAVA_HOME, JRE_HOME, and PATH envContent := fmt.Sprintf(`export JAVA_HOME=%s export JRE_HOME=%s export PATH=$JAVA_HOME/bin:$PATH diff --git a/src/java/jres/jre_test.go b/src/java/jres/jre_test.go index 00e7953ad..784469bfe 100644 --- a/src/java/jres/jre_test.go +++ b/src/java/jres/jre_test.go @@ -344,11 +344,11 @@ dependencies: Expect(err.Error()).To(ContainSubstring("no version of openjdk matching")) }) - It("fails when config format is invalid", func() { + It("falls back to default version when config format has no version", func() { os.Setenv("JBP_CONFIG_OPENJDK", "invalid config") - _, err := jres.GetJREVersion(ctx, "openjdk") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not parse version")) + dep, err := jres.GetJREVersion(ctx, "openjdk") + Expect(err).NotTo(HaveOccurred()) + Expect(dep.Version).NotTo(BeEmpty()) }) }) @@ -394,6 +394,17 @@ dependencies: Expect(err).NotTo(HaveOccurred()) Expect(dep.Version).To(Equal("21.0.5")) }) + + // https://github.com/cloudfoundry/java-buildpack/issues/1270 + // JBP_CONFIG_OPEN_JDK_JRE with only memory_calculator settings (no version) + // should fall back to manifest default, not fail. + It("falls back to default version when only memory_calculator is set", func() { + os.Setenv("JBP_CONFIG_OPEN_JDK_JRE", "{ memory_calculator: { class_count: 30000 } }") + dep, err := jres.GetJREVersion(ctx, "openjdk") + Expect(err).NotTo(HaveOccurred()) + Expect(dep.Name).To(Equal("openjdk")) + Expect(dep.Version).NotTo(BeEmpty()) + }) }) Context("documented environment variables for all JREs", func() { @@ -592,7 +603,7 @@ IMPLEMENTOR="Eclipse Adoptium"` }) }) - Describe("JRE Detection with Environment Variables (Ruby buildpack compatibility)", func() { + Describe("JRE Detection with Environment Variables", func() { var testLogBuffer *bytes.Buffer var testCtx *common.Context