func installFunctionsFramework()

in cmd/java/functions_framework/main.go [238:312]


func installFunctionsFramework(ctx *gcp.Context, layer *libcnb.Layer) (string, error) {

	jars := []string{}
	pomExists, err := ctx.FileExists("pom.xml")
	if err != nil {
		return "", err
	}
	if pomExists {
		mvn, err := java.MvnCmd(ctx)
		if err != nil {
			return "", err
		}
		// If the invoker was listed as a dependency in the pom.xml, copy it into target/_javaInvokerDependency.
		if _, err := ctx.Exec([]string{
			mvn,
			"--batch-mode",
			"dependency:copy-dependencies",
			"-DoutputDirectory=target/_javaInvokerDependency",
			"-DincludeGroupIds=com.google.cloud.functions",
			"-DincludeArtifactIds=java-function-invoker",
		}, gcp.WithUserAttribution); err != nil {
			return "", err
		}
		jars, err = ctx.Glob("target/_javaInvokerDependency/java-function-invoker-*.jar")
		if err != nil {
			return "", fmt.Errorf("finding java-function-invoker jar: %w", err)
		}
	} else {
		buildGradleExists, err := ctx.FileExists("build.gradle")
		if err != nil {
			return "", err
		}
		if buildGradleExists {
			// If the invoker was listed as an implementation dependency it will have been copied to build/_javaFunctionDependencies.
			jars, err = ctx.Glob("build/_javaFunctionDependencies/java-function-invoker-*.jar")
			if err != nil {
				return "", fmt.Errorf("finding java-function-invoker jar: %w", err)
			}
		}
	}
	if len(jars) == 1 && isInvokerJar(ctx, jars[0]) {
		if err := ctx.ClearLayer(layer); err != nil {
			return "", fmt.Errorf("clearing layer %q: %w", layer.Name, err)
		}
		// No need to cache the layer because we aren't downloading the framework.
		layer.Cache = false
		addFrameworkVersionLabel(ctx, layer, jars[0])
		return jars[0], nil
	}
	ctx.Warnf("Failed to find vendored functions-framework dependency. Installing version %s:\n%v", defaultFrameworkVersion, err)

	frameworkVersion := defaultFrameworkVersion

	// Install functions-framework.
	metaVersion := ctx.GetMetadata(layer, versionKey)
	if frameworkVersion == metaVersion {
		ctx.CacheHit(layerName)
	} else {
		ctx.CacheMiss(layerName)
		if err := ctx.ClearLayer(layer); err != nil {
			return "", fmt.Errorf("clearing layer %q: %w", layer.Name, err)
		}
		if err := downloadFramework(ctx, layer, frameworkVersion); err != nil {
			return "", err
		}
		ctx.SetMetadata(layer, versionKey, frameworkVersion)
	}
	cloudfunctions.AddFrameworkVersionLabel(ctx, &cloudfunctions.FrameworkVersionInfo{
		Runtime:  "java",
		Version:  frameworkVersion,
		Injected: true,
	})

	return filepath.Join(layer.Path, "functions-framework.jar"), nil
}