Maven 编译中 Spring项目子模块引用另一个子模块找不到类和方法的异常处理

问题描述

Spring 项目跨模块引用类和方法的时候,子模块 pom 文件已经引入,但在一个模块中找不到另一个模块的包和方法。

解决方案

修改被引用的子模块 spring 构建流程,确保在编译出 fat jar 的同时,还编译出能被其他模块引用的 jar,这样才能被其他模块调用。

具体报错

复制代码
maven 项目 install 出现如下错误,帮我分析原因并解决这个错误。
[INFO] ------------------------------------------------------------- [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/AuthDatasourceServiceImpl.java:[12,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/AuthDatasourceServiceImpl.java:[13,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/AuthDatasourceServiceImpl.java:[30,13] 找不到符号 符号: 类 WorkspaceMemberMapper 位置: 类 com.ruoyi.modifier.service.impl.AuthDatasourceServiceImpl [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/DataModificationRecordServiceImpl.java:[24,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/DataModificationRecordServiceImpl.java:[25,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/DataModificationRecordServiceImpl.java:[72,13] 找不到符号 符号: 类 WorkspaceMemberMapper 位置: 类 com.ruoyi.modifier.service.impl.DataModificationRecordServiceImpl [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[8,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[9,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[10,37] 程序包com.ruoyi.query.pojo.response不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[12,31] 程序包com.ruoyi.system.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[32,11] 找不到符号 符号: 类 SelfQueryDatasourceMapper 位置: 类 com.ruoyi.modifier.service.impl.FeishuMessageSenderService [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[35,11] 找不到符号 符号: 类 SysUserMapper 位置: 类 com.ruoyi.modifier.service.impl.FeishuMessageSenderService [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/SqlExecAsyncService.java:[10,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/SqlExecAsyncService.java:[14,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/SqlExecAsyncService.java:[57,11] 找不到符号 符号: 类 WorkspaceMemberMapper 位置: 类 com.ruoyi.modifier.service.impl.SqlExecAsyncService [INFO] 15 errors [INFO] ------------------------------------------------------------- [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.288 s [INFO] Finished at: 2026-06-24T15:32:46+08:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile (default-compile) on project dataark-modifier: Compilation failure: Compilation failure: [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/AuthDatasourceServiceImpl.java:[12,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/AuthDatasourceServiceImpl.java:[13,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/AuthDatasourceServiceImpl.java:[30,13] 找不到符号 [ERROR] 符号: 类 WorkspaceMemberMapper [ERROR] 位置: 类 com.ruoyi.modifier.service.impl.AuthDatasourceServiceImpl [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/DataModificationRecordServiceImpl.java:[24,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/DataModificationRecordServiceImpl.java:[25,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/DataModificationRecordServiceImpl.java:[72,13] 找不到符号 [ERROR] 符号: 类 WorkspaceMemberMapper [ERROR] 位置: 类 com.ruoyi.modifier.service.impl.DataModificationRecordServiceImpl [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[8,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[9,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[10,37] 程序包com.ruoyi.query.pojo.response不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[12,31] 程序包com.ruoyi.system.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[32,11] 找不到符号 [ERROR] 符号: 类 SelfQueryDatasourceMapper [ERROR] 位置: 类 com.ruoyi.modifier.service.impl.FeishuMessageSenderService [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/FeishuMessageSenderService.java:[35,11] 找不到符号 [ERROR] 符号: 类 SysUserMapper [ERROR] 位置: 类 com.ruoyi.modifier.service.impl.FeishuMessageSenderService [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/SqlExecAsyncService.java:[10,30] 程序包com.ruoyi.query.domain不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/SqlExecAsyncService.java:[14,30] 程序包com.ruoyi.query.mapper不存在 [ERROR] /D:/CodingProjects/dataarkser/dataark-modules/dataark-modifier/src/main/java/com/ruoyi/modifier/service/impl/SqlExecAsyncService.java:[57,11] 找不到符号 [ERROR] 符号: 类 WorkspaceMemberMapper [ERROR] 位置: 类 com.ruoyi.modifier.service.impl.SqlExecAsyncService [ERROR] -> [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/MojoFailureException
Process finished with exit code 1

解决方案

深度思考

```这个错误是因为 dataark-modifier 模块编译时依赖了 com.ruoyi.querycom.ruoyi.system 包下的类,但这些包对应的模块没有先被安装到本地 Maven 仓库,或者 dataark-modifierpom.xml 中没有正确声明对这些模块的依赖。

让我先查看一下:

  1. dataark-modifierpom.xml,看看它依赖了哪些模块
  2. dataark-selfquerydataark-system 的结构,确认这些类是否存在
  3. 项目的整体 pom.xml 结构

需要并行查看这些文件。

复制代码
**已查看文件** *pom.xml*

**已查看文件** *pom.xml*

**已查看目录** 3 个结果

**已查看目录** 1 个结果
深度思考
```我需要进一步了解依赖关系。从根 pom.xml 中可以看到,`dependencyManagement` 里声明了 `dataark-system` 但没有声明 `dataark-selfquery`。而 `dataark-modifier` 的 pom.xml 中引用了 `dataark-selfquery` 和 `dataark-system`,但 `dataark-selfquery` 是在 `dependencyManagement` 之外直接写了 version。

关键是:这个项目的模块结构是怎样的?根 pom.xml 的 modules 里只有 `dataark-modules`,而 `dataark-modules` 本身应该也有自己的 pom.xml 来管理子模块。我需要查看 `dataark-modules/pom.xml`,看看 `dataark-selfquery` 和 `dataark-system` 是否被声明为子模块,以及 `dataark-modifier` 的依赖是否在 `dataark-modules` 的 `dependencyManagement` 中管理了版本。

另外,我需要看看 `dataark-selfquery` 里的包结构,确认 `com.ruoyi.query` 是否存在。因为目录结构显示 `dataark-selfquery/src/main/java/com/ruoyi` 下有 `execsql/` 和 `query/`,可能包名是 `com.ruoyi.query` 或 `com.ruoyi.execsql`。

同时,我需要查看 `dataark-modules/pom.xml`。

已查看文件 pom.xml

已查看目录 9 个结果

已查看目录 7 个结果

深度思考

现在我已经收集了足够的信息来分析这个问题。 复制代码
问题分析:
1. `dataark-modifier` 依赖了 `dataark-selfquery` 和 `dataark-system`。
2. 根 pom.xml 的 `dependencyManagement` 中声明了 `dataark-system`(版本 1.0.1),但没有声明 `dataark-selfquery`。
3. `dataark-modifier` 的 pom.xml 中,`dataark-selfquery` 直接写了 `<version>1.0.1</version>`,而 `dataark-system` 没有写 version(依赖根 pom 的 dependencyManagement)。
4. 在 `dataark-modules/pom.xml` 中,子模块的顺序是:dataark-system -> ... -> dataark-selfquery -> dataark-modifier。
5. 从目录结构来看,`com.ruoyi.query` 和 `com.ruoyi.system` 的源码确实存在。

那么为什么编译时找不到这些包呢?

最可能的原因是:
用户在直接对 `dataark-modifier` 进行 `mvn install`,而没有先对 `dataark-selfquery` 和 `dataark-system` 进行 `mvn install`(或者没有在父模块上执行 `mvn install`)。

因为在多模块 Maven 项目中,模块之间的依赖是通过本地 Maven 仓库(`~/.m2/repository`)来解析的。如果 `dataark-selfquery` 和 `dataark-system` 没有先被 install 到本地仓库,那么 `dataark-modifier` 在编译时就找不到它们的 jar 包。

另外,我也注意到根 pom.xml 的 `dependencyManagement` 里**没有** `dataark-selfquery`。虽然 `dataark-modifier` 自己写了 version,但这不影响依赖解析,只是版本管理的问题。

但是,等等,让我再检查一下:用户是只 install 了 `dataark-modifier`,还是在根目录 install 了整个项目?

从错误信息看,maven 编译只编译了 `dataark-modifier`(`Failed to execute goal ... on project dataark-modifier`),所以用户很可能是在 `dataark-modifier` 目录下直接运行的 `mvn install`,或者是在 IDE 中单独对 `dataark-modifier` 模块执行了 install。

不过还有一个可能:包名虽然存在,但编译失败是因为 Maven reactor 的顺序问题。如果用户在根目录执行 `mvn install`,Maven 会根据模块依赖关系自动排序编译。但如果用户只 install 了 `dataark-modifier`,就会失败。

但还有一个更深层的问题需要检查:`dataark-selfquery` 的 pom.xml 是否有问题?比如它是否把 `com.ruoyi.query` 下的类打包进去了?如果 `dataark-selfquery` 是一个 Spring Boot 应用并且使用了 `spring-boot-maven-plugin` 的 `repackage`,那么它打出来的 jar 包结构可能是一个 fat jar,里面的类在 `BOOT-INF/classes` 下,其他模块依赖它时是无法直接访问到这些类的。

这是一个非常常见的问题!让我检查一下 `dataark-selfquery` 的 pom.xml。

已查看文件 pom.xml

已查看文件 pom.xml

深度思考

现在我完全理解了问题所在! 复制代码
核心问题是:**`dataark-selfquery` 和 `dataark-system` 都配置了 `spring-boot-maven-plugin` 的 `repackage` 目标。**

当一个 Spring Boot 模块配置了 `repackage` 时,Maven 会生成两个 jar 文件:
1. `original-xxx.jar` ------ 标准的普通 jar,包含编译后的 `.class` 文件,可供其他模块依赖。
2. `xxx.jar` ------ 可执行的 fat jar,里面的类被放在 `BOOT-INF/classes/` 目录下。

当其他模块(如 `dataark-modifier`)在 Maven 依赖中引用这个模块时,Maven 默认会拉取 `xxx.jar`(即 fat jar)作为依赖。但是 fat jar 的类在 `BOOT-INF/classes/` 下,标准的 Java 编译器无法从中解析类路径,因此就会出现 "程序包不存在"、"找不到符号" 的错误。

同时,`dataark-system` 也有 `repackage`,但错误中 `com.ruoyi.system.mapper` 只出现了一次。这说明可能 `dataark-system` 之前已经 install 过并且 `original-dataark-system.jar` 被正确引用了?或者 `SysUserMapper` 只在 `FeishuMessageSenderService` 里引用了。

等等,让我再仔细看看。错误信息显示:
- `com.ruoyi.query.domain` 不存在
- `com.ruoyi.query.mapper` 不存在
- `com.ruoyi.query.pojo.response` 不存在
- `com.ruoyi.system.mapper` 不存在

这说明 `dataark-system` 的依赖也有问题。但是为什么之前可能没问题?可能用户之前安装过 `dataark-system` 的普通 jar,或者 `dataark-system` 的问题被 `dataark-selfquery` 的问题掩盖了。

等等,实际上 `dataark-system` 也配置了 `repackage`。所以原理是一样的。

**解决方案:**
对于需要被其他模块依赖的 Spring Boot 模块,应该禁用 `repackage`,或者使用 `classifier` 配置,确保 install/deploy 的普通 jar 是可用的。

标准的做法是:如果一个模块既要作为 Spring Boot 应用运行,又要被其他模块依赖,应该在 `spring-boot-maven-plugin` 中配置 `<classifier>exec</classifier>`,这样:
- `xxx.jar` 就是普通 jar(可供依赖)
- `xxx-exec.jar` 就是可执行 fat jar

或者,更简单的方法是:去掉 `repackage` goal,只在最终打包的应用模块(如 `dataark-auth`, `dataark-gateway`)中保留 `repackage`。

让我看看这个项目中哪些模块有 `repackage`:
- `dataark-auth` ------ 最终应用,可以有
- `dataark-gateway` ------ 最终应用,可以有
- `dataark-selfquery` ------ 被 `dataark-modifier` 依赖,不应该有
- `dataark-system` ------ 被 `dataark-modifier` 依赖,不应该有
- `dataark-modifier` ------ 最终应用,可以有

但等等,还有另一种可能:用户在根目录执行 `mvn clean install`,Maven 的 reactor 会自动处理同一次构建中的模块依赖,即使被依赖模块配置了 `repackage`,在同一次 reactor 构建中,编译器也会直接使用目标目录中的类文件,而不是从 jar 包中读取。所以如果在根目录执行 `mvn clean install`,通常不会因为 `repackage` 导致编译失败。

那么用户到底是怎么执行 install 的?从日志看,`Total time: 4.288 s`,时间很短,说明只编译了 `dataark-modifier` 一个模块。这意味着用户很可能是在 `dataark-modifier` 目录下直接执行了 `mvn install`,或者在 IDE 中只 install 了 `dataark-modifier` 模块。

如果是这样,那么有两种解决方式:
1. **方式一(推荐)**:在根目录执行 `mvn clean install -pl dataark-modules -am`,或者直接在根目录执行 `mvn clean install`,让 Maven 先编译并安装 `dataark-selfquery` 和 `dataark-system` 到本地仓库。但即使这样,由于 `repackage` 的存在,安装的 jar 是 fat jar,`dataark-modifier` 依赖时仍然可能有问题(如果 Maven 使用 jar 依赖而不是 reactor 中的 class 目录)。不过在同一次 reactor 构建中,Maven 会智能处理。
2. **方式二(更彻底)**:修改 `dataark-selfquery` 和 `dataark-system` 的 `pom.xml`,去掉 `repackage` 或添加 `classifier`,确保它们 install 到本地仓库的是普通 jar。

让我再思考一下。实际上,在多模块项目中,如果在根目录执行 `mvn install`,即使子模块有 `repackage`,Maven 在 reactor 内编译依赖模块时,会使用 `target/classes` 目录作为依赖路径,而不是使用 jar 包。所以 `repackage` 在同一次根目录 install 中通常不会导致编译失败。

但是,如果用户只单独 install `dataark-modifier`,或者 `dataark-selfquery`/`dataark-system` 之前已经被 install 成了 fat jar,那么后续 `dataark-modifier` 单独编译时就会失败。

**最可能的场景:**
1. 用户之前在某个时候 install 了 `dataark-selfquery` 和 `dataark-system`,它们被 `repackage` 成了 fat jar。
2. 现在用户单独 install `dataark-modifier`,Maven 从本地仓库读取 `dataark-selfquery-1.0.1.jar`,发现是 fat jar,无法解析其中的类。

**或者:**
用户是在根目录执行 `mvn install`,但由于 `dataark-selfquery` 和 `dataark-system` 在 `dataark-modules/pom.xml` 中出现在 `dataark-modifier` 之后(实际上没有,`dataark-selfquery` 在 `dataark-modifier` 之前,第17行 vs 第19行),Maven reactor 应该能正确处理顺序。等等,让我再看一下 `dataark-modules/pom.xml` 的模块顺序:
- dataark-system (12)
- dataark-gen (13)
- dataark-job (14)
- dataark-file (15)
- dataark-datadev (16)
- dataark-selfquery (17)
- dataark-flowable (18)
- dataark-modifier (19)

顺序是对的,依赖 `dataark-selfquery` 和 `dataark-system` 都在 `dataark-modifier` 之前。所以如果用户在根目录执行 `mvn install`,应该不会报这个错,除非:
- 用户使用了 `-pl dataark-modifier` 单独构建
- 或者 `dataark-selfquery`/`dataark-system` 编译本身也失败了(但日志没有显示)

由于日志只有 `dataark-modifier` 的编译错误,且总时间只有 4.288 秒,我高度怀疑用户是**单独对 `dataark-modifier` 模块执行了 install**。

但不管怎样,`dataark-selfquery` 和 `dataark-system` 配置了 `repackage` 是一个根本性的设计问题,因为:
- 它们作为 Spring Boot 微服务应用,需要 `repackage` 来生成可执行 jar
- 但它们又被 `dataark-modifier` 作为库依赖,需要生成普通 jar

这二者是矛盾的。最佳实践是:对于既需要被依赖又是应用的模块,使用 `classifier`。

**解决方案建议:**

我建议两个层面都处理:

1. **临时快速解决**:在根目录执行 `mvn clean install`,让 Maven 使用 reactor 机制一次性构建所有模块。
2. **根本解决**:修改 `dataark-selfquery` 和 `dataark-system` 的 `pom.xml`,在 `spring-boot-maven-plugin` 中添加 `<classifier>exec</classifier>`,这样:
   ```xml
   <plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
       <executions>
           <execution>
               <goals>
                   <goal>repackage</goal>
               </goals>
               <configuration>
                   <classifier>exec</classifier>
               </configuration>
           </execution>
       </executions>
   </plugin>

这样 dataark-selfquery-1.0.1.jar 就是普通 jar(可被依赖),dataark-selfquery-1.0.1-exec.jar 是可执行 fat jar。

等等,我需要确认一下 dataark-system 是否真的被 dataark-modifier 依赖。从 dataark-modifier/pom.xml 中可以看到:

xml 复制代码
<dependency>
    <groupId>com.taikang.dataark</groupId>
    <artifactId>dataark-system</artifactId>
</dependency>

是的。

另外,我还注意到根 pom.xml 的 dependencyManagement 里没有声明 dataark-selfquery,但 dataark-modifier/pom.xmldataark-selfquery 自己写了 version。这不是导致编译错误的原因,但也是一个问题。不过这不是当前编译错误的主要原因。

让我再确认一下 dataark-systempom.xml ------ 它也有 repackage。所以如果它被 install 到本地仓库,也会产生同样的问题。

还有一个细节:在多模块 Maven 项目中,mvn install 安装到本地仓库的 artifact 默认是 xxx.jar。如果 repackage 执行了,xxx.jar 就会被替换成 fat jar。这是 Spring Boot 插件的默认行为。

所以,如果用户之前完整地 mvn install 过整个项目,那么 dataark-selfquery-1.0.1.jardataark-system-1.0.1.jar 在本地仓库中都是 fat jar。之后即使用户在根目录 mvn install,只要 dataark-selfquerydataark-system 没有重新编译(例如没有修改源码,跳过了编译阶段),Maven 就会从本地仓库读取这两个 fat jar 作为依赖,从而导致 dataark-modifier 编译失败。

啊!这很可能是真正的原因!让我重新梳理:

根本原因很可能是:

dataark-selfquerydataark-system 被配置为 Spring Boot 应用并启用了 repackage。当它们被 mvn install 后,本地仓库中存放的是 fat jar (可执行jar),其中编译后的类被放在 BOOT-INF/classes/ 目录下。

dataark-modifier 依赖这两个模块时,Maven 会引入本地仓库中的 jar。但标准 Java 编译器无法从 fat jar 的 BOOT-INF/classes/ 中读取类,因此报告 "程序包不存在"。

这解释了为什么:

  • 源码目录中明明有 com.ruoyi.query
  • 但编译时却找不到

那为什么之前可能没问题?

可能之前 dataark-modifier 没有依赖 dataark-selfquerydataark-system,或者之前一直是在 reactor 中同时编译(此时 Maven 直接使用 target/classes 而不是 jar),或者 dataark-selfquery/dataark-system 之前还没有加 repackage

不管怎样,现在的解决方案是明确的:

  1. 修改 dataark-selfquerydataark-systempom.xml ,给 spring-boot-maven-pluginrepackage 添加 classifier,使普通 jar 保留为可依赖的库。

  2. 然后从根目录执行 mvn clean install

或者,另一个方案是将 dataark-selfquerydataark-system 中的共享 API(domain、mapper、pojo 等)拆分到独立的 api 模块中。但这个改动太大了。

最简单有效的修改就是加 classifier

让我再想想是否还有其他可能...

等等,还有一个可能:dataark-selfquerydataark-system 模块本身编译可能失败了,导致没有生成 jar,或者生成的 jar 不完整。但日志中并没有显示这些模块的编译错误。而且错误信息很明确是 "程序包不存在",不是 "找不到 artifact"。

另外,dataark-selfquery 的包名确实是 com.ruoyi.query,目录结构也证实了这一点。

所以我的最终结论是:

  • 根本原因是 dataark-selfquerydataark-system 作为被依赖模块,却配置了 spring-boot-maven-pluginrepackage,导致 install 到本地仓库的是 fat jar。
  • 触发原因可能是单独 install dataark-modifier,或者之前 install 的 fat jar 现在被用作了依赖。

我需要给出:

  1. 原因分析
  2. 解决方案(修改 pom.xml 加 classifier)
  3. 也可以建议先从根目录 mvn clean install 作为临时方案

另外,我还应该指出根 pom.xml 的 dependencyManagement 缺少 dataark-selfquery 的声明,虽然这不是导致当前编译错误的原因,但建议补上。

让我检查一下根 pom.xml... 确实没有 dataark-selfquery,只有 dataark-system

好的,我现在就给出完整的分析和解决方案。

修改的文件:

  1. D:\CodingProjects\dataarkser\dataark-modules\dataark-selfquery\pom.xml
  2. D:\CodingProjects\dataarkser\dataark-modules\dataark-system\pom.xml

修改内容:在 spring-boot-maven-pluginrepackage execution 中添加 <classifier>exec</classifier>

对于 dataark-selfquery/pom.xml

xml 复制代码
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </execution>
    </executions>
</plugin>

对于 dataark-system/pom.xml,同样的修改。

我还需要提醒用户:

  • 修改后先 mvn clean install 安装 dataark-selfquerydataark-system
  • 或者直接从根目录 mvn clean install

另外,由于 dataark-system 的 pom 中 <executions><plugin> 之间没有 <configuration>,我需要添加 <configuration><execution> 中。

让我准确地写出修改代码。

dataark-selfquery/pom.xml 当前:

xml 复制代码
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

修改为:

xml 复制代码
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

dataark-system/pom.xml 当前:

xml 复制代码
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

同样修改。

还有一个问题:根 pom.xml 的 dependencyManagement 里缺少 dataark-selfquery。虽然这不是导致当前编译错误的原因,但建议统一加上。

等等,我再想想... dataark-modifier/pom.xmldataark-selfquery 直接写了 <version>1.0.1</version>。如果不改根 pom 也可以。但为了规范,我可以建议加上。

不过,用户现在主要关心的是解决编译错误。我应该聚焦于这个。

让我组织回答:

  1. 直接指出根本原因:spring-boot-maven-pluginrepackage 把被依赖模块打成了 fat jar。
  2. 给出修改方案(两个 pom.xml)。
  3. 给出执行命令建议(先 clean install 被依赖模块,或者从根目录 clean install)。
  4. 补充建议(根 pom 加 dependencyManagement)。

好的,输出代码。

复制代码
这个编译错误的**根本原因**是:`dataark-modifier` 依赖了 `dataark-selfquery` 和 `dataark-system`,但这两个模块的 `pom.xml` 中都配置了 `spring-boot-maven-plugin` 的 `repackage` 目标。

`repackage` 会将打出的 jar 包变成 **Spring Boot 可执行 Fat Jar**,编译后的 `.class` 文件会被放到 `BOOT-INF/classes/` 目录下。当 `dataark-modifier` 编译时,Maven 会从本地仓库引入这两个 jar 作为依赖,但标准 Java 编译器**无法从 Fat Jar 的 `BOOT-INF/classes/` 中解析类**,因此报 "程序包不存在"、"找不到符号"。

---

### 解决方案

需要修改 `dataark-selfquery` 和 `dataark-system` 的 `pom.xml`,在 `repackage` 时添加 `classifier`,让普通 jar(供其他模块依赖)和可执行 jar(用于部署)分离。

#### 1. 修改 `dataark-selfquery/pom.xml`

```xml
// ... existing code ...
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
// ... existing code ...
2. 修改 dataark-system/pom.xml
xml 复制代码
// ... existing code ...
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
// ... existing code ...

重新构建

修改后,在项目根目录执行以下命令重新安装:

bash 复制代码
mvn clean install -DskipTests

这样 dataark-selfquerydataark-system 会先被编译安装,生成的:

  • dataark-selfquery-1.0.1.jar / dataark-system-1.0.1.jar → 普通 jar(dataark-modifier 可以正常依赖)
  • dataark-selfquery-1.0.1-exec.jar / dataark-system-1.0.1-exec.jar → 可执行 Fat Jar(用于部署)

补充建议

根目录 pom.xml<dependencyManagement> 中声明了 dataark-system,但缺少 dataark-selfquery 。建议在根 pom.xml<dependencyManagement> 中统一加上 dataark-selfquery 的版本管理,保持和 dataark-modifier 中直接写版本号的做法一致:

xml 复制代码
// ... existing code ...
            <dependency>
                <groupId>com.taikang.dataark</groupId>
                <artifactId>dataark-system</artifactId>
                <version>${dataark.version}</version>
            </dependency>

            <dependency>
                <groupId>com.taikang.dataark</groupId>
                <artifactId>dataark-selfquery</artifactId>
                <version>${dataark.version}</version>
            </dependency>
// ... existing code ...

这样 dataark-modifier/pom.xml 中引用 dataark-selfquery 时就可以去掉硬编码的 <version>1.0.1</version>,统一从父 POM 继承版本。