Spring Boot控制台启动Jar包时Swagger无法访问问题求助
你用maven-assembly-plugin构建的jar-with-dependencies包,会把所有依赖的类和资源合并到一个Jar中,破坏了Spring Boot应用所需的类路径结构和资源加载规则。Swagger UI的静态资源(HTML/CSS/JS文件)无法被Spring Boot的资源处理器正确识别,导致访问失败;而业务接口因为是Java类编译后直接打包,所以不受影响。
Spring Boot官方提供的spring-boot-maven-plugin会生成符合Spring Boot规范的可执行Fat Jar,自动处理类加载、资源打包等问题,确保Swagger UI正常工作。
步骤1:修改pom.xml的build配置
移除maven-assembly-plugin的所有配置,保留并优化spring-boot-maven-plugin:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring.version}</version> <!-- 和Spring版本保持一致 --> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> <mainClass>com.rad.TestProjectApplication</mainClass> <!-- 显式指定主类,可选但更稳妥 --> </configuration> <executions> <execution> <goals> <goal>repackage</goal> <!-- 必须添加这个执行目标,生成可执行Jar --> </goals> </execution> </executions> </plugin> </plugins> </build>
步骤2:构建Jar包
执行Maven命令:
mvn clean package
打包完成后,在target目录下会生成testproject-1.0-SNAPSHOT.jar(不带jar-with-dependencies后缀)。
步骤3:启动Jar包
用以下命令启动应用:
java -jar target/testproject-1.0-SNAPSHOT.jar
此时访问localhost:8080/swagger就能正常打开Swagger UI了。
步骤4:调整Dockerfile
将Dockerfile中的启动指令修改为:
CMD ["java", "-jar", "/testrepository/testproject-1.0-SNAPSHOT.jar"]
(注意替换为实际生成的Jar包名称)
如果需要保留自定义的打包配置,也可以使用Spring Boot插件的spring-boot:repackage目标,或者使用maven-shade-plugin(但需要配置过滤规则避免冲突),但最稳妥的方式还是直接用Spring Boot官方插件,适配性最好。
内容的提问来源于stack exchange,提问作者Rad

