Skip to content

工程化全景

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.xml

Maven 父 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"]

各工具详细文档

系统学习 Java 生态,深入底层架构