package cnb import ( "path" "path/filepath" "strings" "github.com/goodrain/rainbond/builder/build" "github.com/goodrain/rainbond/builder/parser/code" multi "github.com/goodrain/rainbond/builder/parser/code/multisvc" corev1 "k8s.io/api/core/v1" ) type javaConfig struct{} func (j *javaConfig) BuildAnnotations(re *build.Request, annotations map[string]string) { applyDependencyMirrorAnnotation(annotations) setAnnotationValue(annotations, "cnb-bp-jvm-version", firstNonEmptyEnv(re.BuildEnvs, "BP_JVM_VERSION", "BUILD_RUNTIMES", "RUNTIMES")) setAnnotationValue(annotations, "cnb-bp-jvm-type", firstNonEmptyEnv(re.BuildEnvs, "BP_JVM_TYPE")) goals := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_GOALS") opts := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_OPTS") setAnnotationValue(annotations, "cnb-bp-maven-build-arguments", goals) setAnnotationValue(annotations, "cnb-bp-maven-additional-build-arguments", opts) setAnnotationValue(annotations, "cnb-bp-maven-version", firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_VERSION", "BUILD_RUNTIMES_MAVEN")) builtModule, builtArtifact := resolveMavenBuiltTarget(re) setAnnotationValue(annotations, "cnb-bp-maven-built-module", builtModule) setAnnotationValue(annotations, "cnb-bp-maven-built-artifact", builtArtifact) if re.Lang == code.JavaMaven || re.Lang == code.JaveWar { setAnnotationValue(annotations, "cnb-maven-opts", resolveJavaMavenOpts(re)) } if re.Lang == code.Gradle { setAnnotationValue(annotations, "cnb-bp-gradle-build-arguments", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_BUILD_ARGUMENTS", "BUILD_GRADLE_BUILD_ARGUMENTS")) setAnnotationValue(annotations, "cnb-bp-gradle-additional-build-arguments", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_ADDITIONAL_BUILD_ARGUMENTS", "BUILD_GRADLE_ADDITIONAL_BUILD_ARGUMENTS")) setAnnotationValue(annotations, "cnb-bp-gradle-built-module", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_BUILT_MODULE", "BUILD_GRADLE_BUILT_MODULE")) setAnnotationValue(annotations, "cnb-bp-gradle-built-artifact", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_BUILT_ARTIFACT", "BUILD_GRADLE_BUILT_ARTIFACT")) setAnnotationValue(annotations, "cnb-gradle-opts", resolveJavaGradleOpts(re)) } server := firstNonEmptyEnv(re.BuildEnvs, "BP_JAVA_APP_SERVER", "BUILD_RUNTIMES_SERVER") if server == "" && re.Lang == code.JaveWar { server = "tomcat" } setAnnotationValue(annotations, "cnb-bp-java-app-server", server) } func (j *javaConfig) BuildEnvVars(re *build.Request) []corev1.EnvVar { var envs []corev1.EnvVar builtModule, builtArtifact := resolveMavenBuiltTarget(re) envs = appendEnvVar(envs, "BP_MAVEN_BUILD_ARGUMENTS", firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_GOALS")) envs = appendEnvVar(envs, "BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS", firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_OPTS")) envs = appendEnvVar(envs, "BP_MAVEN_BUILT_MODULE", builtModule) envs = appendEnvVar(envs, "BP_MAVEN_BUILT_ARTIFACT", builtArtifact) if re.Lang == code.JavaMaven || re.Lang == code.JaveWar { envs = appendEnvVar(envs, "MAVEN_OPTS", resolveJavaMavenOpts(re)) } if re.Lang == code.Gradle { envs = appendEnvVar(envs, "GRADLE_OPTS", resolveJavaGradleOpts(re)) } return envs } func (j *javaConfig) InjectMirrorConfig(re *build.Request) error { return ensureProcfile(re) } func (j *javaConfig) CustomOrder(re *build.Request) []orderBuildpack { return nil } func resolveMavenBuiltTarget(re *build.Request) (string, string) { explicitModule := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILT_MODULE", "BUILD_MAVEN_BUILT_MODULE") explicitArtifact := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILT_ARTIFACT", "BUILD_MAVEN_BUILT_ARTIFACT") if explicitModule == "" && explicitArtifact != "" { explicitModule = deriveMavenBuiltModule(explicitArtifact) } if explicitModule != "" || explicitArtifact != "" { return explicitModule, explicitArtifact } if re.Lang != code.JavaMaven { return "", "" } if !fileExists(filepath.Join(re.SourceDir, "pom.xml")) { return "", "" } services, err := multi.NewMaven().ListModules(re.SourceDir) if err != nil || len(services) != 1 { return "", "" } moduleName := strings.TrimSpace(services[0].Name) if moduleName == "" || filepath.IsAbs(moduleName) { return "", "" } builtArtifact := "" if services[0].Envs != nil && services[0].Envs["BUILD_MAVEN_BUILT_ARTIFACT"] != nil { builtArtifact = services[0].Envs["BUILD_MAVEN_BUILT_ARTIFACT"].Value } return moduleName, strings.TrimSpace(builtArtifact) } func deriveMavenBuiltModule(artifact string) string { artifact = strings.TrimSpace(strings.ReplaceAll(artifact, "\\", "/")) if artifact == "" { return "" } artifact = path.Clean(artifact) if artifact == "." || artifact == "/" { return "" } parts := strings.Split(artifact, "/") for idx, part := range parts { if part != "target" || idx == 0 { continue } module := path.Clean(strings.Join(parts[:idx], "/")) if module == "." || module == "/" { return "" } return module } return "" } func resolveJavaMavenOpts(re *build.Request) string { return appendJavaUTF8Options(firstNonEmptyEnv(re.BuildEnvs, "MAVEN_OPTS", "BUILD_MAVEN_JAVA_OPTS")) } func resolveJavaGradleOpts(re *build.Request) string { return appendJavaUTF8Options(firstNonEmptyEnv(re.BuildEnvs, "GRADLE_OPTS", "BUILD_GRADLE_JAVA_OPTS")) }