Windows下Spring Boot应用启动报NoClassDefFoundError问题求助
首次运行一个遗留Spring Boot Java应用,使用OpenJDK 1.8.0_392和Bazel 6.3.2。该应用在Linux系统(同版本Java和Bazel)可正常运行,但在Windows环境下运行时抛出以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/autoconfigure/web/ServerProperties at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.getDeclaredMethod(Class.java:2128) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:47) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) Caused by: java.lang.ClassNotFoundException: org.springframework.boot.autoconfigure.web.ServerProperties at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 7 more
项目的bazel.build文件内容如下:
load("@rules_java//java:defs.bzl", "java_binary", "java_library", "java_test") package(default_visibility = ["//visibility:public"]) load("@rules_spring//springboot:springboot.bzl", "springboot") springboot_deps = [ "@rules_spring//springboot/import_bundles:springboot_required_deps", "@maven//:org_springframework_boot_spring_boot_starter_jetty", "@maven//:org_springframework_boot_spring_boot_starter_web", "@maven//:org_springframework_boot_spring_boot_loader_tools", "@maven//:org_springframework_spring_webmvc", "@maven//:javax_annotation_javax_annotation_api", ] java_library( name = "keycloak-service-lib", srcs = glob(["src/main/java/com/brame/**/*.java"]), resources = glob(["src/main/resources/**/*"]), deps = springboot_deps + [ "@maven//:com_fasterxml_jackson_core_jackson_databind", "@maven//:jakarta_servlet_jakarta_servlet_api", "@maven//:org_jboss_logging_jboss_logging", "@maven//:org_jboss_resteasy_resteasy_jackson2_provider", "@maven//:org_jboss_resteasy_resteasy_jaxrs", "@maven//:org_keycloak_keycloak_dependencies_server_all", "@maven//:org_postgresql_postgresql", "@maven//:org_slf4j_slf4j_api", "@maven//:org_springframework_boot_spring_boot_configuration_processor", "@maven//:org_springframework_boot_spring_boot_starter_actuator", "@maven//:org_springframework_boot_spring_boot_starter_data_jdbc", "@maven//:org_springframework_boot_spring_boot_starter_data_jpa", "@maven//:org_springframework_cloud_spring_cloud_starter_config", "@maven//:org_springframework_cloud_spring_cloud_starter_netflix_eureka_client", "@maven//:org_springframework_boot_spring_boot_autoconfigure" ], ) springboot( name = "keycloak-service-app", boot_app_class = "com.brame.AuthorizationServerApp", java_library = ":keycloak-service-lib", )
经检查,Bazel构建生成的jar文件中不包含org.springframework.boot.autoconfigure.web.ServerProperties类,求解决方法。
验证依赖完整性:
确认@maven//:org_springframework_boot_spring_boot_autoconfigure依赖是否包含目标类。执行以下命令查看依赖构建信息:bazel query --output=build @maven//:org_springframework_boot_spring_boot_autoconfigure也可以找到该依赖jar文件的本地Bazel缓存路径,解压后检查是否存在
org/springframework/boot/autoconfigure/web/ServerProperties.class。调整springboot规则打包配置:
修改springboot目标,添加include_all_deps = True配置,强制规则将所有依赖打入可执行jar:springboot( name = "keycloak-service-app", boot_app_class = "com.brame.AuthorizationServerApp", java_library = ":keycloak-service-lib", include_all_deps = True, )清理Bazel缓存后重建:
Windows下Bazel缓存可能存在残留问题,执行清理命令后重新构建:bazel clean --expunge bazel build //:keycloak-service-app检查依赖版本一致性:
确认Windows和Linux环境使用的Spring Boot依赖版本完全一致。在WORKSPACE文件中锁定Spring Boot相关依赖的版本,避免Bazel自动拉取不同版本的依赖。排查路径解析问题:
检查WORKSPACE中maven_install的配置,确保Windows下路径分隔符处理正常,没有因路径转义导致的依赖拉取失败。
内容的提问来源于stack exchange,提问作者los pollos hermanos

