搜 索

Java常用开发工具总结

  • 203阅读
  • 2022年11月06日
  • 0评论
首页 / 编程 / 正文
🛠️ "工欲善其事,必先利其器。然后你会发现,光有器不行,还得会用。"

前言:为什么工具很重要

还记得刚学Java的时候吗?用记事本写代码,手动 javac 编译,然后 java 运行。那种纯粹的快乐,大概持续了...三天。

然后你发现:

  • 写错一个分号,编译报错一百行
  • 想重构一个方法名,要改二十个文件
  • 调试全靠 System.out.println
  • 打包发布全靠玄学

于是你开始寻找工具,然后发现工具比代码还多...

本文将系统性地介绍Java开发中的各类工具,帮你从"工具困难症"中解脱出来。


一、工具全景图

mindmap root((Java开发工具)) IDE集成开发环境 IntelliJ IDEA Eclipse VS Code 构建工具 Maven Gradle Ant 版本控制 Git SVN 代码质量 SonarQube Checkstyle SpotBugs PMD 调试诊断 Arthas JProfiler VisualVM JConsole API测试 Postman Apifox Bruno 数据库工具 DBeaver Navicat DataGrip 容器部署 Docker Kubernetes 文档工具 Swagger Javadoc Markdown 其他工具 Lombok MapStruct JRebel

二、IDE:你的第二个家

2.1 IntelliJ IDEA —— 宇宙第一IDE

"用过IDEA的人,都不想再用别的了。" —— 真实的用户反馈

核心优势

特性说明
智能补全不只是补全,是读心术
重构能力改名、提取、移动,一键搞定
调试器强大到可以回退执行
Git集成图形化操作,告别命令行恐惧
插件生态想要啥都有

必装插件清单

📦 效率提升类
├── Lombok                    # 注解生成getter/setter
├── MyBatisX                  # MyBatis增强,XML与Mapper跳转
├── GenerateAllSetter         # 一键生成所有setter调用
├── GsonFormatPlus           # JSON转Java实体类
├── String Manipulation      # 字符串格式转换神器
└── Key Promoter X           # 快捷键提示,帮你戒掉鼠标

📦 代码质量类
├── SonarLint                # 代码质量实时检查
├── Alibaba Java Coding Guidelines  # 阿里巴巴编码规范
├── CheckStyle-IDEA          # 代码风格检查
└── SpotBugs                 # Bug静态分析

📦 工具增强类
├── Maven Helper             # Maven依赖分析/冲突解决
├── JRebel                   # 热部署神器(付费)
├── RestfulTool              # RESTful接口快速测试
├── Translation              # 翻译插件,英文文档救星
└── Rainbow Brackets         # 彩虹括号,嵌套不迷路

📦 美化类
├── One Dark Theme           # 暗色主题
├── Atom Material Icons      # 文件图标美化
└── Nyan Progress Bar        # 彩虹猫进度条(摸鱼必备)

常用快捷键速查

🔥 高频快捷键(macOS / Windows)

【导航】
⌘O / Ctrl+N          → 查找类
⌘⇧O / Ctrl+Shift+N   → 查找文件
⌘⌥O / Ctrl+Shift+Alt+N → 查找符号(方法/变量)
⌘E / Ctrl+E          → 最近打开的文件
⌘B / Ctrl+B          → 跳转到定义
⌘⌥B / Ctrl+Alt+B     → 跳转到实现
⌘U / Ctrl+U          → 跳转到父类/接口
⌘[ / Ctrl+Alt+←      → 返回上一个位置
⌘] / Ctrl+Alt+→      → 前进到下一个位置

【编辑】
⌘D / Ctrl+D          → 复制当前行
⌘⌫ / Ctrl+Y          → 删除当前行
⌥⇧↑ / Alt+Shift+↑    → 上移当前行
⌘/ / Ctrl+/          → 单行注释
⌘⌥/ / Ctrl+Shift+/   → 多行注释
⌘⌥L / Ctrl+Alt+L     → 格式化代码
⌘⌥O / Ctrl+Alt+O     → 优化导入

【重构】
⇧F6 / Shift+F6       → 重命名
⌘⌥M / Ctrl+Alt+M     → 提取方法
⌘⌥V / Ctrl+Alt+V     → 提取变量
⌘⌥F / Ctrl+Alt+F     → 提取字段
⌘⌥C / Ctrl+Alt+C     → 提取常量

【调试】
F8                    → 单步跳过
F7                    → 单步进入
⇧F8 / Shift+F8       → 单步跳出
F9                    → 继续执行
⌘F8 / Ctrl+F8        → 切换断点

【生成】
⌘N / Alt+Insert      → 生成代码(构造器/getter/setter等)
⌘⌥T / Ctrl+Alt+T     → 包围代码(try-catch/if等)
⌘J / Ctrl+J          → 插入Live Template

IDEA 高级技巧

// 1. Postfix Completion —— 后缀补全
user.null    → if (user == null) { }
user.notnull → if (user != null) { }
user.var     → User user = user;
list.for     → for (Item item : list) { }
list.fori    → for (int i = 0; i < list.size(); i++) { }
result.return → return result;
exception.throw → throw exception;

// 2. Live Templates —— 代码模板
sout  → System.out.println();
soutv → System.out.println("变量 = " + 变量);
psvm  → public static void main(String[] args) { }
fori  → for (int i = 0; i < ; i++) { }
iter  → for (Object o : ) { }

// 3. 自定义 Live Template
// Settings → Editor → Live Templates
// 示例:创建 "log" 模板
private static final Logger log = LoggerFactory.getLogger($CLASS$.class);
// 设置 $CLASS$ 变量为 className()

2.2 VS Code —— 轻量级选手

适合场景:

  • 快速编辑配置文件
  • 前端开发
  • 轻量级Java项目
  • Markdown写作

Java开发必装扩展:

Extension Pack for Java    # 微软官方Java扩展包
Spring Boot Extension Pack # Spring Boot支持
Lombok Annotations Support # Lombok支持

2.3 IDE对比

quadrantChart title IDE选择象限图 x-axis 轻量 --> 功能丰富 y-axis 免费 --> 付费 quadrant-1 企业首选 quadrant-2 个人付费 quadrant-3 入门首选 quadrant-4 轻量免费 IntelliJ Ultimate: [0.9, 0.85] IntelliJ Community: [0.75, 0.15] Eclipse: [0.7, 0.1] VS Code: [0.3, 0.1] NetBeans: [0.5, 0.1]

三、构建工具:项目的骨架

3.1 Maven —— 稳如老狗

"Maven虽然XML写到手软,但它就是稳。"

核心概念

flowchart TB subgraph 生命周期 A[clean] --> B[validate] B --> C[compile] C --> D[test] D --> E[package] E --> F[verify] F --> G[install] G --> H[deploy] end subgraph 核心要素 I[POM.xml] J[依赖管理] K[插件系统] L[仓库机制] end I --> J I --> K J --> L

pom.xml 模板

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 项目坐标 -->
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <!-- 属性配置 -->
    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        
        <!-- 依赖版本统一管理 -->
        <spring-boot.version>3.2.0</spring-boot.version>
        <lombok.version>1.18.30</lombok.version>
    </properties>

    <!-- 依赖管理(用于多模块项目) -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 依赖 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 构建配置 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
            </plugin>
        </plugins>
    </build>

    <!-- 多环境配置 -->
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <env>dev</env>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <env>prod</env>
            </properties>
        </profile>
    </profiles>
</project>

Maven 常用命令

# 基础命令
mvn clean                    # 清理target目录
mvn compile                  # 编译源代码
mvn test                     # 运行测试
mvn package                  # 打包
mvn install                  # 安装到本地仓库
mvn deploy                   # 部署到远程仓库

# 组合命令
mvn clean package            # 清理并打包
mvn clean install -DskipTests  # 跳过测试安装
mvn clean package -P prod    # 使用prod环境打包

# 依赖相关
mvn dependency:tree          # 查看依赖树
mvn dependency:analyze       # 分析依赖(找出未使用的)
mvn versions:display-dependency-updates  # 检查依赖更新

# 调试相关
mvn -X clean package         # Debug模式,输出详细日志
mvn -e clean package         # 显示错误堆栈

# 多模块项目
mvn -pl module-name clean package  # 只构建指定模块
mvn -am -pl module-name clean package  # 同时构建依赖模块

Maven Wrapper(推荐)

# 生成Maven Wrapper
mvn wrapper:wrapper

# 使用Wrapper(无需安装Maven)
./mvnw clean package         # Linux/Mac
mvnw.cmd clean package       # Windows

3.2 Gradle —— 新时代的选择

"Gradle:用代码写构建脚本,真香!"

build.gradle.kts(Kotlin DSL)

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    java
    id("org.springframework.boot") version "3.2.0"
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.20"
    kotlin("plugin.spring") version "1.9.20"
}

group = "com.example"
version = "1.0.0-SNAPSHOT"

java {
    sourceCompatibility = JavaVersion.VERSION_17
}

repositories {
    mavenCentral()
    // 阿里云镜像
    maven { url = uri("https://maven.aliyun.com/repository/public") }
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    
    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")
    
    runtimeOnly("com.mysql:mysql-connector-j")
    
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs += "-Xjsr305=strict"
        jvmTarget = "17"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

// 自定义任务
tasks.register("hello") {
    doLast {
        println("Hello from Gradle!")
    }
}

Gradle 常用命令

# 基础命令
./gradlew clean              # 清理
./gradlew build              # 构建
./gradlew test               # 测试
./gradlew bootRun            # 运行Spring Boot应用

# 依赖相关
./gradlew dependencies       # 查看依赖树
./gradlew dependencyInsight --dependency lombok  # 查看特定依赖

# 任务相关
./gradlew tasks              # 列出所有任务
./gradlew tasks --all        # 列出所有任务(包括隐藏的)

# 性能优化
./gradlew build --parallel   # 并行构建
./gradlew build --build-cache  # 使用构建缓存

3.3 Maven vs Gradle

特性MavenGradle
配置语言XMLGroovy/Kotlin DSL
学习曲线较低较高
构建速度一般快(增量构建+缓存)
灵活性约定优于配置高度灵活
IDE支持优秀优秀
社区生态非常成熟快速增长
适用场景企业标准项目复杂构建/Android

四、代码质量工具

4.1 静态代码分析

flowchart LR A[代码提交] --> B[SonarLint
IDE实时检查] B --> C[Git Commit] C --> D[CI Pipeline] D --> E[SonarQube
服务端分析] E --> F{质量门禁} F -->|通过| G[部署] F -->|失败| H[修复] H --> A

SonarQube 集成

<!-- Maven插件配置 -->
<plugin>
    <groupId>org.sonarsource.scanner.maven</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>3.10.0.2594</version>
</plugin>
# 执行分析
mvn sonar:sonar \
  -Dsonar.projectKey=my-project \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=your-token

Checkstyle 配置

<!-- pom.xml -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>3.3.1</version>
    <configuration>
        <configLocation>checkstyle.xml</configLocation>
        <consoleOutput>true</consoleOutput>
        <failsOnError>true</failsOnError>
    </configuration>
</plugin>
<!-- checkstyle.xml 简化版 -->
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
    "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
    <module name="TreeWalker">
        <!-- 命名规范 -->
        <module name="ConstantName"/>
        <module name="LocalVariableName"/>
        <module name="MethodName"/>
        <module name="TypeName"/>
        
        <!-- 代码风格 -->
        <module name="AvoidStarImport"/>
        <module name="OneStatementPerLine"/>
        <module name="EmptyBlock"/>
        
        <!-- 复杂度 -->
        <module name="CyclomaticComplexity">
            <property name="max" value="10"/>
        </module>
    </module>
    
    <!-- 文件级别 -->
    <module name="FileLength">
        <property name="max" value="500"/>
    </module>
</module>

SpotBugs(FindBugs继任者)

<plugin>
    <groupId>com.github.spotbugs</groupId>
    <artifactId>spotbugs-maven-plugin</artifactId>
    <version>4.8.2.0</version>
    <configuration>
        <effort>Max</effort>
        <threshold>Low</threshold>
        <xmlOutput>true</xmlOutput>
    </configuration>
</plugin>

4.2 代码格式化

Google Java Format

<plugin>
    <groupId>com.spotify.fmt</groupId>
    <artifactId>fmt-maven-plugin</artifactId>
    <version>2.21.1</version>
    <executions>
        <execution>
            <goals>
                <goal>format</goal>
            </goals>
        </execution>
    </executions>
</plugin>

EditorConfig(统一编辑器配置)

# .editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.{yml,yaml}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false

五、调试诊断工具

5.1 Arthas —— 线上诊断神器

"有了Arthas,线上问题不用重启就能查。"

安装与启动

# 下载
curl -O https://arthas.aliyun.com/arthas-boot.jar

# 启动(自动attach到Java进程)
java -jar arthas-boot.jar

常用命令速查

# 🔍 基础命令
dashboard          # 实时数据面板
thread             # 查看线程状态
thread -n 3        # 查看最忙的3个线程
thread -b          # 查看阻塞线程
jvm                # JVM信息
sysprop            # 系统属性
sysenv             # 环境变量

# 🔍 类/方法相关
sc com.example.*   # 搜索类
sm com.example.UserService  # 搜索方法
jad com.example.UserService # 反编译类

# 🔍 方法监控
watch com.example.UserService getUser returnObj  # 观察返回值
watch com.example.UserService getUser '{params,returnObj}' -x 2  # 观察入参和返回值
trace com.example.UserService getUser  # 方法调用路径追踪
tt -t com.example.UserService getUser  # 记录方法调用(TimeTunnel)
tt -l                  # 查看记录
tt -p -i 1001          # 重放调用

# 🔍 性能分析
profiler start         # 开始CPU分析
profiler stop          # 停止并生成火焰图
profiler stop --format html  # 生成HTML格式

# 🔍 热修复(慎用)
redefine /tmp/UserService.class  # 热更新类

# 🔍 其他
ognl '@java.lang.System@out.println("hello")'  # 执行OGNL表达式
vmtool --action getInstances --className com.example.User  # 获取对象实例

Arthas 实战场景

# 场景1:接口响应慢,定位耗时方法
trace com.example.OrderService createOrder '#cost > 100'

# 场景2:查看方法入参和返回值
watch com.example.UserService login '{params,returnObj,throwExp}' -e -x 3

# 场景3:统计方法调用次数和RT
monitor -c 5 com.example.UserService getUser

# 场景4:查看Spring Bean
vmtool --action getInstances \
  --className org.springframework.context.ApplicationContext \
  --express 'instances[0].getBean("userService")'

5.2 JProfiler —— 专业性能分析

flowchart TB subgraph JProfiler功能 A[CPU分析] B[内存分析] C[线程分析] D[数据库分析] E[HTTP分析] end A --> A1[热点方法] A --> A2[调用树] A --> A3[火焰图] B --> B1[堆内存快照] B --> B2[对象分配] B --> B3[GC分析] C --> C1[线程状态] C --> C2[锁分析] C --> C3[死锁检测]

5.3 VisualVM —— 免费的可视化工具

# JDK自带,直接运行
jvisualvm

# 或者下载独立版本
# https://visualvm.github.io/

功能:

  • 监控CPU、内存、线程
  • 堆Dump分析
  • 线程Dump分析
  • 采样器和分析器
  • 插件扩展

5.4 JVM 命令行工具

# jps - 列出Java进程
jps -l                    # 显示完整主类名
jps -v                    # 显示JVM参数

# jstack - 线程堆栈
jstack <pid>              # 打印线程堆栈
jstack -l <pid>           # 包含锁信息

# jmap - 内存映射
jmap -heap <pid>          # 堆内存概况
jmap -histo <pid>         # 对象直方图
jmap -dump:format=b,file=heap.hprof <pid>  # 导出堆转储

# jstat - JVM统计
jstat -gc <pid> 1000      # 每秒输出GC统计
jstat -gcutil <pid> 1000  # GC百分比统计

# jinfo - JVM配置
jinfo <pid>               # 查看所有配置
jinfo -flag MaxHeapSize <pid>  # 查看特定参数

# jcmd - 统一诊断命令(推荐)
jcmd <pid> VM.flags       # JVM参数
jcmd <pid> Thread.print   # 线程堆栈
jcmd <pid> GC.heap_info   # 堆信息
jcmd <pid> GC.run         # 触发GC

六、API开发测试工具

6.1 Postman —— API测试王者

核心功能

📦 Postman功能
├── 请求构建         # GET/POST/PUT/DELETE等
├── 环境变量         # dev/test/prod环境切换
├── 集合管理         # API分组管理
├── 预请求脚本       # 请求前执行JS
├── 测试脚本         # 响应后断言
├── Mock Server      # 模拟服务
├── API文档          # 自动生成文档
└── 团队协作         # 共享集合

脚本示例

// Pre-request Script - 生成签名
const timestamp = Date.now();
const secret = pm.environment.get("secret");
const sign = CryptoJS.MD5(timestamp + secret).toString();
pm.environment.set("timestamp", timestamp);
pm.environment.set("sign", sign);

// Tests - 断言响应
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Response has userId", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.data).to.have.property('userId');
});

// 提取Token并保存
var jsonData = pm.response.json();
if (jsonData.data && jsonData.data.token) {
    pm.environment.set("token", jsonData.data.token);
}

6.2 Apifox —— 国产全能选手

"Postman + Swagger + Mock = Apifox"

优势:

  • 中文界面友好
  • API设计 + 调试 + Mock + 测试一体化
  • 支持导入Swagger/OpenAPI
  • 团队协作功能完善
  • 免费版功能够用

6.3 HTTP Client(IDEA内置)

### 登录接口
POST http://localhost:8080/api/auth/login
Content-Type: application/json

{
  "username": "admin",
  "password": "123456"
}

> {%
    client.global.set("token", response.body.data.token);
%}

### 获取用户信息(使用上一步的token)
GET http://localhost:8080/api/user/info
Authorization: Bearer {{token}}

### 带环境变量
GET {{host}}/api/users
Accept: application/json

七、数据库工具

7.1 工具对比

工具价格支持数据库特点
DBeaver免费/付费80+开源,功能全面
DataGrip付费主流全支持JetBrains出品,智能
Navicat付费MySQL/PostgreSQL等老牌,稳定
MySQL Workbench免费MySQL官方工具
TablePlus付费主流全支持macOS原生,美观

7.2 DBeaver 推荐配置

🔧 常用设置
├── SQL编辑器
│   ├── 自动补全(Ctrl+Space)
│   ├── 格式化快捷键(Ctrl+Shift+F)
│   └── 执行快捷键(Ctrl+Enter)
├── 连接配置
│   ├── 保存密码
│   ├── SSH隧道
│   └── 只读模式(生产环境)
└── 数据导出
    ├── CSV/Excel/JSON/SQL
    └── 批量导出表结构

7.3 数据库版本管理

Flyway

// application.yml
spring:
  flyway:
    enabled: true
    locations: classpath:db/migration
    baseline-on-migrate: true

// 脚本命名规则:V1__Create_user_table.sql
// V{版本号}__{描述}.sql
-- V1__Create_user_table.sql
CREATE TABLE user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- V2__Add_email_column.sql
ALTER TABLE user ADD COLUMN email VARCHAR(100);

Liquibase

<!-- db/changelog/db.changelog-master.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.9.xsd">

    <changeSet id="1" author="joey">
        <createTable tableName="user">
            <column name="id" type="BIGINT" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="username" type="VARCHAR(50)">
                <constraints nullable="false"/>
            </column>
        </createTable>
    </changeSet>
    
</databaseChangeLog>

八、文档工具

8.1 Swagger/OpenAPI

@Configuration
public class SwaggerConfig {
    
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
            .info(new Info()
                .title("用户服务API")
                .version("1.0.0")
                .description("用户管理相关接口")
                .contact(new Contact()
                    .name("Joey")
                    .email("joey@example.com")))
            .externalDocs(new ExternalDocumentation()
                .description("项目Wiki")
                .url("https://wiki.example.com"));
    }
}
@RestController
@RequestMapping("/api/users")
@Tag(name = "用户管理", description = "用户CRUD接口")
public class UserController {

    @Operation(summary = "获取用户列表", description = "分页获取用户列表")
    @Parameters({
        @Parameter(name = "page", description = "页码", example = "1"),
        @Parameter(name = "size", description = "每页数量", example = "10")
    })
    @GetMapping
    public Result<Page<UserVO>> listUsers(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        return Result.success(userService.list(page, size));
    }

    @Operation(summary = "创建用户")
    @ApiResponses({
        @ApiResponse(responseCode = "200", description = "创建成功"),
        @ApiResponse(responseCode = "400", description = "参数错误")
    })
    @PostMapping
    public Result<UserVO> createUser(
            @RequestBody @Valid UserCreateDTO dto) {
        return Result.success(userService.create(dto));
    }
}

8.2 Javadoc 规范

/**
 * 用户服务类,提供用户相关的业务操作。
 *
 * <p>主要功能包括:
 * <ul>
 *   <li>用户注册和登录</li>
 *   <li>用户信息管理</li>
 *   <li>权限验证</li>
 * </ul>
 *
 * <p>使用示例:
 * <pre>{@code
 * UserService userService = new UserService();
 * User user = userService.findById(1L);
 * }</pre>
 *
 * @author Joey
 * @version 1.0.0
 * @since 2024-01-01
 * @see UserRepository
 */
public class UserService {

    /**
     * 根据ID查询用户。
     *
     * @param id 用户ID,不能为null
     * @return 用户对象,如果不存在返回null
     * @throws IllegalArgumentException 如果id为null
     * @throws UserNotFoundException 如果用户不存在
     */
    public User findById(Long id) {
        // ...
    }

    /**
     * 创建新用户。
     *
     * @param dto 用户创建参数
     * @return 创建成功的用户对象
     * @deprecated 使用 {@link #createUserV2(UserCreateDTO)} 代替
     */
    @Deprecated
    public User createUser(UserCreateDTO dto) {
        // ...
    }
}

九、效率神器

9.1 Lombok —— 告别样板代码

// 之前:几十行getter/setter/toString...
public class User {
    private Long id;
    private String username;
    private String email;
    // ... getter/setter/toString/equals/hashCode
}

// 之后:几个注解搞定
@Data                      // getter/setter/toString/equals/hashCode
@Builder                   // 建造者模式
@NoArgsConstructor         // 无参构造
@AllArgsConstructor        // 全参构造
@Slf4j                     // 日志对象
public class User {
    private Long id;
    private String username;
    private String email;
}

// 使用示例
User user = User.builder()
    .id(1L)
    .username("joey")
    .email("joey@example.com")
    .build();

log.info("Created user: {}", user);

Lombok 注解速查

注解作用
@Getter/@Setter生成getter/setter
@ToString生成toString
@EqualsAndHashCode生成equals和hashCode
@Data以上四个的组合
@Builder建造者模式
@NoArgsConstructor无参构造器
@AllArgsConstructor全参构造器
@RequiredArgsConstructorfinal字段构造器
@Slf4j生成log对象
@Value不可变类
@SneakyThrows偷偷抛出受检异常
@Cleanup自动关闭资源

9.2 MapStruct —— 对象映射神器

// 定义Mapper接口
@Mapper(componentModel = "spring")
public interface UserMapper {

    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    // 简单映射
    UserVO toVO(User user);
    
    // 批量映射
    List<UserVO> toVOList(List<User> users);
    
    // 字段名不同时
    @Mapping(source = "createTime", target = "createdAt")
    @Mapping(source = "updateTime", target = "updatedAt")
    UserVO toVOWithMapping(User user);
    
    // 忽略某些字段
    @Mapping(target = "password", ignore = true)
    UserVO toVOWithoutPassword(User user);
    
    // 使用表达式
    @Mapping(target = "fullName", expression = "java(user.getFirstName() + \" \" + user.getLastName())")
    UserVO toVOWithExpression(User user);
    
    // 更新已有对象
    void updateUserFromDTO(UserUpdateDTO dto, @MappingTarget User user);
}

// 使用
User user = userRepository.findById(id);
UserVO vo = UserMapper.INSTANCE.toVO(user);

9.3 JRebel —— 热部署神器

"改代码不用重启,节省的时间可以多喝两杯咖啡。"

功能:

  • 修改Java代码即时生效
  • 修改配置文件即时生效
  • 修改资源文件即时生效
  • 支持大部分框架

价格:付费(但真的很值)

9.4 其他效率工具

📦 开发效率工具
├── DevToys          # Windows开发者工具箱
├── He3              # 开发者工具集合
├── Regex101         # 正则表达式测试
├── JSON Formatter   # JSON格式化
├── Cron表达式生成器  # Cron在线生成
└── PlantUML         # 文本画UML图

📦 终端工具
├── iTerm2           # macOS终端增强
├── Oh My Zsh        # Zsh配置框架
├── Windows Terminal # Windows终端
└── Tmux             # 终端复用

📦 效率工具
├── Alfred/Raycast   # macOS效率启动器
├── Snipaste         # 截图贴图
├── Typora           # Markdown编辑器
└── Draw.io          # 流程图绘制

十、工具链整合:从开发到部署

flowchart LR subgraph 开发阶段 A[IDEA] --> B[编码] B --> C[Lombok/MapStruct] C --> D[本地测试] D --> E[Arthas调试] end subgraph 提交阶段 F[Git提交] --> G[Pre-commit Hook] G --> H[Checkstyle检查] H --> I[单元测试] end subgraph CI/CD J[Jenkins/GitLab CI] --> K[Maven/Gradle构建] K --> L[SonarQube扫描] L --> M[Docker打包] M --> N[K8s部署] end E --> F I --> J

完整工具链示例

# .gitlab-ci.yml 示例
stages:
  - build
  - test
  - quality
  - deploy

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"

build:
  stage: build
  image: maven:3.9-eclipse-temurin-17
  script:
    - mvn clean package -DskipTests
  artifacts:
    paths:
      - target/*.jar

test:
  stage: test
  script:
    - mvn test
  artifacts:
    reports:
      junit: target/surefire-reports/*.xml

sonarqube:
  stage: quality
  script:
    - mvn sonar:sonar -Dsonar.host.url=$SONAR_HOST -Dsonar.login=$SONAR_TOKEN
  only:
    - main
    - develop

deploy-prod:
  stage: deploy
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - kubectl set image deployment/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  only:
    - main
  when: manual

十一、总结

工具选择原则

flowchart TD A[选择工具] --> B{团队是否已有标准?} B -->|是| C[遵循团队标准] B -->|否| D{项目规模?} D -->|小型| E[选择轻量级工具] D -->|大型| F[选择功能全面的工具] E --> G{是否免费?} F --> G G -->|需要免费| H[开源方案] G -->|可以付费| I[商业方案]

工具推荐总结

类别首选备选
IDEIntelliJ IDEAVS Code
构建Maven/Gradle-
版本控制Git-
代码质量SonarQube + SonarLintCheckstyle + SpotBugs
调试ArthasJProfiler (付费)
API测试ApifoxPostman
数据库DBeaverDataGrip (付费)
文档Swagger/OpenAPI-
效率Lombok + MapStruct-

最后的话

"工具不在多,够用就好。关键是形成自己的工作流,让工具为你服务,而不是被工具绑架。"

记住:

  1. 先掌握核心工具:IDE、构建工具、Git,这三个必须精通
  2. 按需引入其他工具:不要为了用工具而用工具
  3. 持续优化工作流:定期review自己的开发效率,发现瓶颈
  4. 分享和交流:好工具要分享给团队,提升整体效率

参考资料

评论区
暂无评论
avatar