在分布式开发或者多服务架构场景下,多个Maven项目经常需要使用相同的实体类,比如用户实体、订单实体等。如果每个项目都单独编写一遍这些实体,不仅会增加冗余代码,还会在实体字段调整时出现版本不一致的问题。通过构建Maven多模块结构实现实体共享,是解决这类问题的有效方案。

Maven多模块结构的核心思路
Maven多模块的本质是有一个父项目作为容器,下面包含多个子模块,父项目负责管理所有子模块的依赖版本、插件配置等公共信息,子模块之间可以互相引用依赖。要实现实体共享,我们可以单独创建一个公共实体模块,把需要共享的实体类都放在这个模块中,其他业务模块只需要引入这个公共实体模块的依赖,就可以直接使用其中的实体类。
具体实现步骤
1. 创建父项目
首先创建一个普通的Maven项目作为父项目,父项目的打包方式需要设置为pom,同时删除默认的src目录,因为父项目只做配置管理,不需要存放业务代码。父项目的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>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<!-- 声明子模块 -->
<modules>
<module>common-entity</module>
<module>user-service</module>
<module>order-service</module>
</modules>
<!-- 统一依赖版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2. 创建公共实体模块
在父项目下创建一个名为common-entity的子模块,这个模块的打包方式为默认的jar,用来存放所有需要共享的实体类。模块的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>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>common-entity</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
然后在common-entity模块中编写需要共享的实体类,比如用户实体:
package com.ippipp.common.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
private Long id;
private String username;
private String phone;
private Integer status;
private LocalDateTime createTime;
}
3. 业务模块引入公共实体依赖
创建业务子模块比如user-service,在它的pom.xml中引入common-entity模块的依赖,就可以直接使用其中的实体类了:
<?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>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>user-service</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>common-entity</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
在user-service模块中可以直接使用User实体:
package com.example.user.service;
import com.ippipp.common.entity.User;
public class UserService {
public User getUserById(Long id) {
User user = new User();
user.setId(id);
user.setUsername("testUser");
return user;
}
}
实体共享的注意事项
- 公共实体模块只存放需要共享的实体类,不要混入业务逻辑代码,避免模块职责不清晰。
- 实体类的字段调整需要同步更新所有依赖该模块的业务模块,建议做好版本管理,避免不兼容的修改。
- 如果实体需要支持序列化,记得实现
Serializable接口,并且定义合适的serialVersionUID。 - 父项目的
dependencyManagement只做版本声明,子模块引入依赖时不需要再写版本号,保证所有模块依赖版本统一。
优势总结
通过Maven多模块结构实现实体共享,能够减少重复代码编写,降低实体版本不一致的风险,同时让项目结构更清晰,便于后续维护和扩展。当实体类需要更新时,只需要修改公共实体模块,所有依赖它的业务模块更新依赖版本即可,大幅提升开发效率。