环境信息
- 系统:Arch Linux
- Java:OpenJDK 8(容器内)
- Maven:3.9.12
- Docker & Compose:最新版
- 项目版本:
jshERP-boot(日志显示 ErpApplication v3.6-SNAPSHOT)
- Spring Boot:2.0.0.RELEASE
复现流程
1. 源码编译
cd /mnt/GreatWall/Projects/jshERP
mvn clean package -DskipTests
2. Dockerfile
FROM eclipse-temurin:8-jre
WORKDIR /app
ARG JAR_FILE=jshERP-boot/target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 9999
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
3. docker-compose.yml
services:
mysql:
image: mysql:8.0.24
environment:
MYSQL_ROOT_PASSWORD: "Root@123456"
MYSQL_DATABASE: "jsh_erp"
ports:
- "3306:3306"
volumes:
- ./docker/mysql/data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -pRoot@123456"]
interval: 10s
timeout: 5s
retries: 20
redis:
image: redis:5
command: ["redis-server", "--requirepass", "123456"]
ports:
- "6379:6379"
app:
build:
context: .
dockerfile: Dockerfile
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
environment:
JAVA_OPTS: "-Dspring.main.allow-circular-references=true -Xms256m -Xmx1024m"
SPRING_DATASOURCE_URL: "jdbc:mysql://mysql:3306/jsh_erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Root@123456"
SPRING_REDIS_HOST: "redis"
SPRING_REDIS_PORT: "6379"
SPRING_REDIS_PASSWORD: "123456"
SPRING_PROFILES_ACTIVE: "prod"
ports:
- "9999:9999"
volumes:
- ./logs:/app/logs
4. .dockerignore
docker/mysql/data
docker/mysql/data/**
.git
.gitignore
node_modules
5. 完整启动脚本(full-workflow.sh)
#!/bin/bash
set -e
cd /mnt/GreatWall/Projects/jshERP
# 1) 清理旧数据(MySQL 5.7 → 8.0 需删旧数据目录)
sudo rm -rf docker/mysql/data
# 2) 编译 jar(容器内 JDK8 编译)
docker run --rm \
-v "$(pwd)":/build \
-w /build \
maven:3.8.6-openjdk-8 \
mvn clean package -DskipTests
# 3) 构建并启动所有服务
docker compose down
docker compose up -d --build
# 4) 查看状态
docker compose ps
# 5) 查看 app 日志(等待 "Tomcat started on port(s): 9999")
docker compose logs -f app
实际结果
编译功能正常(jar 正常产出),但运行时 Spring 启动失败,容器反复 Restarting (1):
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'platformConfigService':
Bean with name 'platformConfigService' has been injected into other beans [userService]
in its raw version as part of a circular reference, but has eventually been wrapped.
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'systemConfigController': Injection of resource dependencies failed;
nested exception is ... BeanCurrentlyInCreationException ...
端口 localhost:9999 无法访问(ERR_CONNECTION_REFUSED)。
根因定位
源码级双向注入(循环依赖):
UserService.java → 注入 PlatformConfigService
@Resource
private PlatformConfigService platformConfigService;
PlatformConfigService.java → 又注入回 UserService
@Resource
private UserService userService;
SystemConfigService 同时依赖这两者,触发初始化链冲突。
注意:spring.main.allow-circular-references=true 在 Spring Boot 2.0.0.RELEASE 下不生效(该参数是 2.6+ 引入)。
期望结果
应用正常启动,日志出现 Tomcat started on port(s): 9999,后端可访问。
我个人是个java菜鸟,说实话每咋有时间去调试java代码,希望后来人可以试试看,这个代码的问题应该不是容器造成的,本地跑应该也会有,也就是说我怀疑目前的源码有问题?(很大胆的怀疑
环境信息
jshERP-boot(日志显示ErpApplication v3.6-SNAPSHOT)复现流程
1. 源码编译
cd /mnt/GreatWall/Projects/jshERP mvn clean package -DskipTests2. Dockerfile
3. docker-compose.yml
4. .dockerignore
5. 完整启动脚本(full-workflow.sh)
实际结果
编译功能正常(jar 正常产出),但运行时 Spring 启动失败,容器反复
Restarting (1):端口
localhost:9999无法访问(ERR_CONNECTION_REFUSED)。根因定位
源码级双向注入(循环依赖):
UserService.java→ 注入PlatformConfigServicePlatformConfigService.java→ 又注入回UserServiceSystemConfigService同时依赖这两者,触发初始化链冲突。注意:
spring.main.allow-circular-references=true在 Spring Boot 2.0.0.RELEASE 下不生效(该参数是 2.6+ 引入)。期望结果
应用正常启动,日志出现
Tomcat started on port(s): 9999,后端可访问。我个人是个java菜鸟,说实话每咋有时间去调试java代码,希望后来人可以试试看,这个代码的问题应该不是容器造成的,本地跑应该也会有,也就是说我怀疑目前的源码有问题?(很大胆的怀疑