【Java项目脚手架系列】第一篇:Maven基础项目脚手架
前言
在Java开发中,一个好的项目脚手架可以大大提高开发效率,减少重复工作。本系列文章将介绍各种常用的Java项目脚手架,帮助开发者快速搭建项目。今天,我们先从最基础的Maven项目脚手架开始。
什么是项目脚手架?
项目脚手架(Project Scaffold)是一个项目的基础框架,它包含了项目的基本结构、常用依赖、配置文件和最佳实践。使用脚手架可以:
- 统一项目结构
- 减少重复工作
- 提高开发效率
- 保证代码质量
Maven基础项目脚手架
1. 项目结构
maven-basic-scaffold/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── App.java
│ │ └── resources/
│ │ └── log4j2.xml
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── AppTest.java
│ └── resources/
├── docs/
│ └── 01-maven-basic-scaffold.md
├── pom.xml
└── README.md
2. 核心文件内容
2.1 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>maven-basic-scaffold</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>5.8.2</junit.version>
<lombok.version>1.18.22</lombok.version>
<log4j2.version>2.17.1</log4j2.version>
</properties>
<dependencies>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- Log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2 App.java
package com.example;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class App {
public static void main(String[] args) {
log.info("Application started");
System.out.println("Hello Maven Basic Scaffold!");
log.info("Application finished");
}
}
2.3 AppTest.java
package com.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class AppTest {
@Test
public void testApp() {
assertTrue(true);
}
}
2.4 log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Property>
<Property name="APP_LOG_ROOT">logs</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<RollingFile name="FileAppender"
fileName="${APP_LOG_ROOT}/app.log"
filePattern="${APP_LOG_ROOT}/app-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileAppender"/>
</Root>
</Loggers>
</Configuration>
3. 使用说明
-
克隆项目
git clone git@gitee.com:zengqiang_wang/leecode-inteview-questions-journal.git
-
导入IDE
- 推荐使用IntelliJ IDEA
- 选择"Open as Maven Project"
-
运行项目
- 运行
App.java
的main方法 - 查看控制台输出和日志文件
- 运行
-
编写测试
- 在
src/test/java
下创建测试类 - 使用JUnit 5编写测试用例
- 在
4. 最佳实践
-
代码组织
- 遵循包命名规范
- 合理划分模块
- 保持代码整洁
-
日志使用
- 使用SLF4J接口
- 合理设置日志级别
- 记录关键业务信息
-
测试编写
- 单元测试覆盖核心业务
- 使用断言验证结果
- 保持测试代码简洁
-
Lombok使用
- 安装Lombok插件(IDE中)
- 启用注解处理
- 使用
@Slf4j
注解自动生成日志对象 - 使用其他注解简化代码(如
@Data
,@Builder
等)
5. 常见问题
-
依赖下载失败
- 检查Maven配置
- 配置国内镜像源
- 清理本地仓库
-
编译错误
- 检查JDK版本
- 更新Maven插件
- 清理项目缓存
-
日志不输出
- 检查配置文件
- 确认日志级别
- 验证文件权限
-
Lombok相关问题
- IDEA中报错但能运行:安装Lombok插件
- 找不到log变量:检查
@Slf4j
注解是否正确 - 编译错误:确保启用了注解处理
Q: 为什么使用
@Slf4j
注解后,代码中的log
变量在IDEA中显示红色报错,但项目却能正常运行?A: 这是因为
@Slf4j
是Lombok提供的注解,它会在编译期自动生成log
变量。具体来说:-
当使用
@Slf4j
注解时,Lombok会在编译时自动生成如下代码:private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(App.class);
-
IDEA报错的原因是:
- IDEA默认不会识别Lombok的注解处理器
- 需要安装Lombok插件并启用注解处理
-
解决方案:
- 安装Lombok插件:
- 打开IDEA设置 (File -> Settings)
- 转到Plugins
- 搜索"Lombok"
- 安装插件并重启IDEA
- 启用注解处理:
- 打开IDEA设置 (File -> Settings)
- 转到Build, Execution, Deployment -> Compiler -> Annotation Processors
- 勾选"Enable annotation processing"
- 安装Lombok插件:
完成以上配置后,IDEA就能正确识别Lombok生成的代码,红色报错就会消失。
总结
这个Maven基础项目脚手架提供了:
- 标准的项目结构
- 必要的开发依赖
- 完整的日志配置
- 测试框架支持
你可以基于这个脚手架快速开始新项目,只需要:
- 添加业务代码
- 编写单元测试
- 配置业务参数
参考资源
下期预告
下一期,我们将介绍JavaWeb项目脚手架,包含:
- Servlet配置
- 静态资源处理
- Web容器配置
- 更多实用功能
敬请期待!