Terraform配置GAE弹性环境Java11运行时异常求助
你遇到的UnsupportedClassVersionError是因为GAE Flex实际使用Java8运行时,但你的代码是用Java11编译的(class文件版本55.0,Java8仅支持到52.0)。核心问题是运行时配置未生效,同时存在配置冲突和拼写错误。
1. 修正Terraform配置中的错误
(1)统一Service名称
Terraform里的service = "servcie1"存在拼写错误,改为和app.yaml一致的service = "api",否则会部署到不同服务,导致配置不匹配。
(2)移除重复的Runtime配置
删除Terraform资源中的runtime = "java",让app.yaml完全主导运行时配置,避免两者冲突。
(3)修正app_yaml_path格式
把cloud_build_options.app_yaml_path = "[./app.yaml]"改为cloud_build_options.app_yaml_path = "./app.yaml",方括号是无效格式,会导致Cloud Build无法正确读取app.yaml。
(4)移除重复的自动缩放配置
删除Terraform里的automatic_scaling块,因为app.yaml已经配置了自动缩放规则,重复配置会引发优先级冲突,以app.yaml的配置为准即可。
修正后的Terraform资源示例:
resource "google_app_engine_flexible_app_version" "myapp_v1" { version_id = "v1" project = "fresh-test1" service = "api" # 修正拼写错误,与app.yaml保持一致 deployment { files { name = "micronaut-helloworld-0.1.jar" source_url = "https://storage.googleapis.com/${google_storage_bucket.bucket.name}/${google_storage_bucket_object.object.name}" } cloud_build_options { app_yaml_path = "./app.yaml" # 移除多余的方括号 } } liveness_check { path = "/" } readiness_check { path = "/" } env_variables = { port = "8080" } delete_service_on_destroy = true service_account = google_service_account.custom_service_account.email }
2. 确认app.yaml配置有效性
你的app.yaml配置是正确的,runtime_config部分明确指定了Java11和Ubuntu22操作系统,这是GAE Flex支持Java11的标准配置:
runtime: java env: flex runtime_config: operating_system: ubuntu22 runtime_version: 11 service: api # 其他配置保持不变
3. 验证代码编译版本
确保你的micronaut-helloworld-0.1.jar是用Java11编译的(targetCompatibility设置为11),如果使用Maven/Gradle构建,检查对应配置:
- Maven(pom.xml):
<properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> - Gradle(build.gradle):
java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 }
4. 重新部署
执行以下步骤完成部署:
- 确保app.yaml和修正后的Terraform配置在同一目录
- 运行
terraform init初始化配置 - 运行
terraform plan检查配置无误 - 运行
terraform apply执行部署
- Cloud Shell中的Java版本和JAVA_HOME设置不会影响GAE Flex的运行时,因为GAE在云端环境中构建和运行应用,运行时由app.yaml配置决定。
- 如果部署后仍有问题,可查看Cloud Build日志,确认构建过程中是否正确读取了app.yaml的
runtime_config配置。
内容的提问来源于stack exchange,提问作者Abhishek Solanki

