工程化全景
Java 工程化体系成熟完善。掌握 Maven/Gradle 构建、Docker 部署、JVM 调优和线上诊断工具,是生产级 Java 工程师的必备技能。
工具链全景
Java 工程化
├── 构建工具
│ ├── Maven — 最流行,约定优于配置
│ └── Gradle — 灵活,性能更好,Android 标配
│
├── 代码质量
│ ├── Checkstyle — 代码风格检查
│ ├── SpotBugs — 静态 Bug 分析
│ ├── PMD — 代码质量分析
│ └── SonarQube — 综合代码质量平台
│
├── 测试
│ ├── JUnit 5 — 测试框架
│ ├── Mockito — Mock 框架
│ ├── AssertJ — 流式断言
│ ├── Testcontainers — 容器化集成测试
│ └── JMeter — 压力测试
│
├── 性能分析
│ ├── JProfiler — 商业,功能强大
│ ├── Arthas — 开源,线上诊断神器
│ ├── JFR — Java Flight Recorder(JDK 内置)
│ └── async-profiler — 低开销 CPU/内存分析
│
└── 部署 & 监控
├── Docker — 容器化
├── Prometheus + Grafana — 指标监控
├── SkyWalking — 链路追踪
└── ELK Stack — 日志分析推荐项目结构(Spring Boot 多模块)
my-project/
├── pom.xml # 父 POM
├── my-common/ # 公共模块
│ ├── src/main/java/
│ │ └── com/example/common/
│ │ ├── exception/ # 自定义异常
│ │ ├── response/ # 统一响应
│ │ └── utils/ # 工具类
│ └── pom.xml
│
├── my-domain/ # 领域模型
│ ├── src/main/java/
│ │ └── com/example/domain/
│ │ ├── entity/ # JPA/MyBatis 实体
│ │ ├── dto/ # 数据传输对象
│ │ └── vo/ # 视图对象
│ └── pom.xml
│
├── my-service/ # 业务逻辑
│ ├── src/main/java/
│ │ └── com/example/service/
│ │ ├── UserService.java
│ │ └── impl/
│ └── pom.xml
│
├── my-repository/ # 数据访问
│ ├── src/main/java/
│ │ └── com/example/repository/
│ │ ├── mapper/ # MyBatis Mapper
│ │ └── repository/ # Spring Data Repository
│ └── pom.xml
│
└── my-web/ # Web 层(启动模块)
├── src/main/java/
│ └── com/example/web/
│ ├── Application.java
│ ├── controller/
│ ├── config/
│ └── interceptor/
├── src/main/resources/
│ ├── application.yml
│ ├── application-dev.yml
│ └── application-prod.yml
└── pom.xmlMaven 父 POM 配置
xml
<!-- pom.xml(父模块) -->
<project>
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my-common</module>
<module>my-domain</module>
<module>my-service</module>
<module>my-repository</module>
<module>my-web</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
</parent>
<properties>
<java.version>21</java.version>
<mybatis-plus.version>3.5.7</mybatis-plus.version>
<lombok.version>1.18.32</lombok.version>
</properties>
<!-- 依赖版本管理(子模块继承,不自动引入) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>Docker 多阶段构建
dockerfile
# Dockerfile
# 构建阶段
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
# 先复制 pom.xml,利用 Docker 缓存
COPY pom.xml .
COPY my-common/pom.xml my-common/
COPY my-domain/pom.xml my-domain/
COPY my-service/pom.xml my-service/
COPY my-repository/pom.xml my-repository/
COPY my-web/pom.xml my-web/
# 下载依赖(利用缓存)
RUN mvn dependency:go-offline -B
# 复制源码并构建
COPY . .
RUN mvn clean package -DskipTests -B
# 运行阶段
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
# 创建非 root 用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# 复制 jar 包
COPY --from=builder /app/my-web/target/*.jar app.jar
# JVM 参数
ENV JAVA_OPTS="-Xms512m -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]