Java Spring Boot 项目从创建到上线的完整流程梳理
下面是一个 Java Spring Boot 项目从创建到上线的完整流程梳理,我会分为 6 个主要阶段:
1. 项目创建与初始化
(1) 创建项目
- 方式一:使用 Spring Initializr
- 选择依赖:Spring Web、Spring Data JPA、MySQL Driver、Lombok 等
- 生成项目并解压
- 方式二:使用 IDE(IntelliJ IDEA)
File → New → Project → Spring Initializr
- 方式三:命令行创建
curl https://start.spring.io/starter.zip -d dependencies=web,data-jpa,mysql \ -d type=maven-project -d groupId=com.example -d artifactId=myapp -o myapp.zip
(2) 项目结构
myapp/
├── src/
│ ├── main/
│ │ ├── java/com/example/myapp/
│ │ │ ├── MyappApplication.java # 主启动类
│ │ │ ├── controller/ # 控制器层
│ │ │ ├── service/ # 服务层
│ │ │ ├── repository/ # 数据访问层
│ │ │ └── model/ # 实体类
│ │ └── resources/
│ │ ├── application.properties # 配置文件
│ │ ├── static/ # 静态资源
│ │ └── templates/ # 模板文件
│ └── test/ # 测试代码
├── pom.xml # Maven 配置文件
└── .gitignore # Git 忽略规则
2. 本地开发
(1) 配置开发环境
- 数据库:配置
application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456 spring.jpa.hibernate.ddl-auto=update
- API 测试:使用 Postman 或 Swagger
- 添加依赖:
springdoc-openapi-starter-webmvc-ui
- 添加依赖:
(2) 核心开发
使用分层架构:
// Controller 示例 @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping public List<User> getUsers() { return userService.getAllUsers(); } }
(3) 本地运行
mvn spring-boot:run
# 或
./mvnw spring-boot:run
3. 测试阶段
(1) 单元测试
使用 JUnit 5 + Mockito
@ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserService userService; @Test void testGetUserById() { when(userRepository.findById(1L)).thenReturn(Optional.of(new User())); assertNotNull(userService.getUserById(1L)); } }
(2) 集成测试
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnUsers() throws Exception {
mockMvc.perform(get("/api/users"))
.andExpect(status().isOk());
}
}
(3) 测试覆盖率
- 使用 JaCoCo 插件(
pom.xml
配置)<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.8</version> <executions> <execution> <goals> <goal>prepare-agent</goal> <goal>report</goal> </goals> </execution> </executions> </plugin>
- 生成报告:
mvn test
→target/site/jacoco/index.html
4. 构建与打包
(1) 生产环境配置
application-prod.properties
:server.port=8080 spring.profiles.active=prod spring.datasource.url=${DB_URL} spring.datasource.username=${DB_USER} spring.datasource.password=${DB_PASS}
(2) 打包应用
- 可执行 JAR(推荐):
mvn clean package -DskipTests # 生成文件:target/myapp-0.0.1-SNAPSHOT.jar
- WAR 包(如需部署到外部 Tomcat):
<!-- pom.xml 修改 --> <packaging>war</packaging>
(3) Docker 化(可选)
# Dockerfile
FROM openjdk:17-alpine
COPY target/myapp-*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
构建镜像:
docker build -t myapp:1.0 .
5. 部署上线
(1) 服务器准备
- 最小化要求:
- OS:Linux (Ubuntu/CentOS)
- Java:JDK 17+
- 数据库:MySQL/PostgreSQL
- 防火墙开放端口:8080(应用)、3306(DB)
(2) 部署方式
方式一:直接运行 JAR
java -jar myapp-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
方式二:使用 Systemd 托管
# /etc/systemd/system/myapp.service
[Unit]
Description=My Spring Boot App
After=syslog.target
[Service]
User=appuser
ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
SuccessExitStatus=143
Environment="DB_URL=jdbc:mysql://db-server:3306/proddb"
Environment="DB_USER=produser"
Environment="DB_PASS=prodpwd"
[Install]
WantedBy=multi-user.target
操作命令:
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
方式三:Docker 部署
docker run -d -p 8080:8080 \
-e DB_URL=jdbc:mysql://host.docker.internal:3306/proddb \
-e DB_USER=produser \
-e DB_PASS=prodpwd \
--name myapp myapp:1.0
6. 运维与监控
(1) 基础监控
- 添加 Actuator 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
- 监控端点:
/actuator/health
,/actuator/metrics
(2) 日志管理
- 使用 Logback 配置日志轮转:
<!-- resources/logback-spring.xml --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> </appender>
(3) 告警与 APM
- 集成方案:
- 监控:Prometheus + Grafana
- 链路追踪:Zipkin/SkyWalking
- 日志:ELK Stack
关键注意事项
- 环境隔离:严格区分 dev/test/prod 配置
- 安全规范:
- 禁止明文密码(使用环境变量/配置中心)
- 启用 HTTPS
- 使用 Spring Security 做权限控制
- CI/CD:集成 Jenkins/GitLab CI
# .gitlab-ci.yml 示例 build: stage: build script: - mvn clean package -DskipTests deploy_prod: stage: deploy script: - scp target/*.jar user@server:/opt/myapp/ - ssh user@server "sudo systemctl restart myapp"
- 回滚方案:保留历史版本 JAR,快速切换
完整流程耗时参考:小型项目(1-2天),中型项目(1-2周)
本作品采用《CC 协议》,转载必须注明作者和本文链接