这篇博客介绍了JAVA下如何使用Meavn以及对应的报错处理。
Meavn管理
多模块项目的创建
Maven支持将一个大型项目分成多个子模块,每个子模块可以有自己的pom.xml文件、源代码和依赖库等信息。
- Parent多模块项目的创建
创建一个多模块项目可以采用如下的命令:
mvn archetype:generate -DgroupId=com.mycompany.app
-DartifactId=my-app-parent
-DarchetypeGroupId=org.apache.maven.archetypes
-DinteractiveMode=false
其中,-DgroupId指定项目的groupId,-DartifactId指定项目的artifactId,-DarchetypeGroupId指定使用的Maven原型。
执行以上命令后,Maven会在当前目录下生成一个名为my-app-parent的项目,作为多模块项目的父项目。
- Son子模块的创建
在多模块项目中创建子模块可以采用如下的命令:
mvn archetype:generate -DgroupId=com.mycompany.app
-DartifactId=my-app-webapp
-DarchetypeGroupId=org.apache.maven.archetypes
-DinteractiveMode=false
其中,-DgroupId指定项目的groupId,-DartifactId指定项目的artifactId,-DarchetypeGroupId指定使用的Maven原型。
执行以上命令后,Maven会在当前目录下生成一个名为my-app-webapp的子模块项目,并将其作为my-app-parent的子模块。
PS: 报错,当我运行完上述第一条创建父类的指令之后,我运行son指令的时候出现了报错如下
(base) root@DESKTOP-GTJ6F35:my-app-parent# mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app-webapp -DarchetypeGroupId=org.apache.maven.archetypes -DinteractiveMode=false
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.mycompany.app:my-app-parent >-------------------
[INFO] Building my-app-parent 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.4.1:generate (default-cli) > generate-sources @ my-app-parent >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.4.1:generate (default-cli) < generate-sources @ my-app-parent <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.4.1:generate (default-cli) @ my-app-parent ---
[INFO] Generating project in Batch mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /root/tiger/ByFunction/Java/myTest/my-app-parent
[INFO] Parameter: package, Value: com.mycompany.app
[INFO] Parameter: groupId, Value: com.mycompany.app
[INFO] Parameter: artifactId, Value: my-app-webapp
[INFO] Parameter: packageName, Value: com.mycompany.app
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.678 s
[INFO] Finished at: 2025-11-20T10:55:41+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.4.1:generate (default-cli) on project my-app-parent: Unable to add module to the current project as it is not of packaging type 'pom' -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
分析:
我已经指定了路径:/root/tiger/ByFunction/Java/myTest/my-app-parent,我已经进入到了父类里面来创建子类,总结最后的报错是 Unable to add module to the current project as it is not of packaging type 'pom' 。
解析:
修改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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app-parent</artifactId>
<!--如果这个大文件夹可以被别人import 就需要设定为jar -->
<!--<packaging>jar</packaging> -->
<!-- 但是如果这个大文件是最大的父类,就需要设置为pom -->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app-parent</name>
<url>http://maven.apache.org</url>
<!-- 注意一开始创建的时候不能有下列modules,否则无法创建该子类,因为创建之后它会自动添加 -->
<modules>
<module>my-app-webapp</module>
</modules>
</project>
- 父项目和子模块的关系(一般自动创建)
在多模块项目中,父项目和子模块之间有一个很重要的关系:子模块引用父项目。这意味着子模块可以继承来自父项目的所有设置,例如依赖管理、插件管理等。
在子模块的pom.xml文件中,我们需要使用parent节点来声明该子模块所依赖的父项目:
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
在父项目的pom.xml文件中,则需要使用modules节点来声明其中包含哪些子模块:
<modules>
<module>my-app-webapp</module>
<module>my-app-service</module>
<module>my-app-dao</module>
</modules>
多模块项目的构建
在构建多模块项目时,我们需要先进入父项目的目录进行构建。如果只构建父项目,则会同时构建所有子模块,例如:
cd my-app-parent
mvn clean install
如果只想构建某个子模块,则可以进入该子模块的目录进行构建,例如:
cd my-app-webapp
mvn clean package
在构建子模块时,Maven会自动检查父项目是否已经被构建,如果未被构建,则先构建父项目。这样,我们就可以轻松地构建多模块项目,并快速实现应用的部署。
镜像设置
镜像是一个Maven仓库的映像,通俗点说就是一个网站。Maven中心库是每次构建Java项目时必须要访问的远程库,但是Maven官方中心库位于美国,由于众所周知的原因,其下载速度较慢。这时候,我们可以使用国内的Maven镜像来代替。 在<font style="color:rgb(25, 27, 31);">settings.xml</font>文件中,我们可以通过<font style="color:rgb(25, 27, 31);">mirrors</font>节点来配置Maven镜像,例如:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
PS: 如何找到配置文件 settings.xml 呢?
- 使用
mvn -v命令
(base) root@DESKTOP:gulimall# mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.15, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.15.167.4-microsoft-standard-wsl2", arch: "amd64", family: "unix"
- 则目录为
**/usr/share/maven/conf/settings.xml**
代理设置
在某些情况下,我们需要通过代理服务器来进行网络请求。例如,在公司内部开发环境中,网络访问需要经过代理服务器才能访问外部网站。 在settings.xml文件中,我们可以通过proxies节点来配置Maven的代理设置,例如:<proxies>
<proxy>
<id>myproxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.example.com</host>
<port>8080</port>
<username>myuser</username>
<password>mypassword</password>
<nonProxyHosts>localhost|*.example.com</nonProxyHosts>
</proxy>
</proxies>
证书设置
有些远程仓库需要授权才能下载其中的库。在这种情况下,我们需要通过配置证书来实现认证。 在settings.xml文件中,我们可以通过server节点来配置认证信息,例如:<servers>
<server>
<id>myserver</id>
<username>myuser</username>
<password>mypassword</password>
</server>
</servers>
报错整理
📌 1. gulimail-common编译不过
首先处理模块是否正确构建并安装到本地仓库。首先,检查 gulimail-common 模块是否构建为 JAR 包,确保 gulimail-common 模块已经构建并安装到本地仓库。如果 gulimail-common 模块还没有被编译或安装到 Maven 本地仓库(~/.m2/repository),product 模块是无法找到它的。
解决方法:先在 gulimail-common 模块目录下运行 mvn install,确保它已被安装到本地仓库,然后再构建 gulimail-product 模块
cd gulimall/gulimail-common && mvn clean install -q
验证是否已经被编译到本地仓库
ls -l ~/.m2/repository/com/atpepper/gulimail/gulimail-common/0.0.1-SNAPSHOT
验证输出:
(base) root@DESKTOP:gulimall# l
total 32
-rw-r--r-- 1 root root 214 Nov 19 22:42 _remote.repositories
-rw-r--r-- 1 root root 14256 Nov 19 22:42 gulimail-common-0.0.1-SNAPSHOT.jar
-rw-r--r-- 1 root root 2141 Nov 19 21:11 gulimail-common-0.0.1-SNAPSHOT.pom
-rw-r--r-- 1 root root 166 Nov 19 21:06 m2e-lastUpdated.properties
-rw-r--r-- 1 root root 722 Nov 19 22:42 maven-metadata-local.xml
局部编译product模块
cd /Java/gulimall && mvn -pl gulimail-product -am clean compile -q
冲突依赖排查
如果有多个版本的 gulimail-common 存在于项目的依赖树中,可能会导致冲突,Maven 会选择一个版本来解析依赖,而其他版本可能被忽略。
mvn dependency:tree
#来查看项目的依赖树,确保没有版本冲突。
📌 2. 文件命名问题
对应test和main

📌 3. generator自生成的代码中有数据格式错误
private byte[] rollbackInfo;
// 修改原来的 private Longblob rollbackInfo;
Longblob 类型生成错误处理
错误原因
- Longblob 是数据库字段类型 (MySQL LONGBLOB),并非 Java 类型
- 代码生成时未正确映射,回退输出原始类型名 Longblob,导致编译失败
处理方案
- 在 generator.properties 中统一将 blob / tinyblob / mediumblob / longblob 映射为 byte[]
- 模板使用 $column.attrType 后直接生成: private byte[] rollbackInfo;
- 无需额外 import
为什么使用 byte[]
- 与 BLOB 语义一致,表示原始二进制数据
- 避免错误类型名与大小写不一致问题
- 比使用 String 更准确,可按需做序列化/传输
总结
- 确保所有 BLOB 相关类型都已配置映射
- 重新生成后不再出现 Longblob 非法类型
- 后续处理(如存取、转换)在 Service 层完成
📌4. DAO 与包结构不一致
4.1 先检查 sprintboot版本
<!-- 方案1 -->
<properties>
<java.version>17</java.version>
<mybatis-plus.version>3.5.6</mybatis-plus.version>
<lombok.version>1.18.34</lombok.version>
<redisson.version>3.27.2</redisson.version>
<spring-cloud.version>2024.0.2</spring-cloud.version>
</properties>
<!-- 方案2 -->
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.27.2</version>
</dependency>
</dependencies>
</properties>
4.1 修改了mapper的路径,注意批量修改其自动生成mapper
比如我从@MapperScan("com.atpepper.gulimail.coupon.dao"),修改为@MapperScan("com.atpepper.coupon.dao")


💥5. Mapper 映射冲突问题
错误日志摘录:
Ambiguous mapping. Cannot map 'pmsAttrController' method ... to { [/update]}:
There is already 'pmsAttrAttrgroupRelationController' bean method ... mapped.
问题说明:
- 两个控制器方法均映射到同一路径 /update
- Spring 无法决定请求 /update 时调用哪个方法
原因:
- 类未使用区分性的类级别 @RequestMapping 前缀
- 方法级别路径重复
解决方案(推荐方案一):
方案一:添加类级别前缀(推荐)
@RestController
@RequestMapping("/pms/attr")
public class PmsAttrController {
@RequestMapping("/update")
public R update(@RequestBody PmsAttrEntity pmsAttr) { ... }
}
@RestController
@RequestMapping("/pms/attrgrouprelation")
public class PmsAttrAttrgroupRelationController {
@RequestMapping("/update")
public R update(@RequestBody PmsAttrAttrgroupRelationEntity rel) { ... }
}
最终路径:
/pms/attr/update/pms/attrgrouprelation/update
方案二:仅修改方法级别路径
// ...
@RequestMapping("/attr/update") // 区分路径
public R update(@RequestBody PmsAttrEntity pmsAttr) { ... }
// ...
@RequestMapping("/attrgrouprelation/update") // 区分路径
public R update(@RequestBody PmsAttrAttrgroupRelationEntity pmsAttrAttrgroupRelation) { ... }
处理: 为以下仍无类级前缀的控制器统一添加唯一类级路径:
CouponController -> /coupon/couponCouponHistoryController -> /coupon/coupon/historyCouponSpuCategoryRelationController -> /coupon/coupon/spu/categoryCouponSpuRelationController -> /coupon/coupon/spu/relationHomeAdvController -> /coupon/home/advHomeSubjectController -> /coupon/home/subjectHomeSubjectSpuController -> /coupon/home/subject/spuMemberPriceController -> /coupon/member/priceSeckillPromotionController -> /coupon/seckill/promotionSeckillSessionController -> /coupon/seckill/sessionSeckillSkuNoticeController -> /coupon/seckill/sku/noticeSeckillSkuRelationController -> /coupon/seckill/sku/relationSkuFullReductionController -> /coupon/sku/full/reductionSkuLadderController -> /coupon/sku/ladderSpuBoundsController -> /coupon/spu/bounds
结论:已添加所有类级别 @RequestMapping,原先的 /update 重复不再出现。使用类级别语义化前缀更清晰、符合 REST 设计。
💥6. Redis 连接异常
当前错误:Unable to connect to Redis server: localhost:6379
和 NOAUTH Authentication required,说明本地未启动 Redis 或需要密码。
解决选项:
- 启动本地 Redis 并确保端口 6379 及密码配置正确(若有密码在 application.yml 添加 spring.redis.password)。
- 如果暂时不需要缓存/分布式锁,移除或注释掉 redisson-spring-boot-starter 相关依赖以避免自动配置。
- 或在配置文件中禁用 Redisson 自动配置(排除配置类或使用条件属性)但最简单是移除依赖。
采用方案2:
<!-- 移除 Redisson 依赖 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>${redisson.version}</version>
</dependency>
