问题描述
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.query 和 com.ruoyi.system 包下的类,但这些包对应的模块没有先被安装到本地 Maven 仓库,或者 dataark-modifier 的 pom.xml 中没有正确声明对这些模块的依赖。
让我先查看一下:
dataark-modifier的pom.xml,看看它依赖了哪些模块dataark-selfquery和dataark-system的结构,确认这些类是否存在- 项目的整体
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.xml 里 dataark-selfquery 自己写了 version。这不是导致编译错误的原因,但也是一个问题。不过这不是当前编译错误的主要原因。
让我再确认一下 dataark-system 的 pom.xml ------ 它也有 repackage。所以如果它被 install 到本地仓库,也会产生同样的问题。
还有一个细节:在多模块 Maven 项目中,mvn install 安装到本地仓库的 artifact 默认是 xxx.jar。如果 repackage 执行了,xxx.jar 就会被替换成 fat jar。这是 Spring Boot 插件的默认行为。
所以,如果用户之前完整地 mvn install 过整个项目,那么 dataark-selfquery-1.0.1.jar 和 dataark-system-1.0.1.jar 在本地仓库中都是 fat jar。之后即使用户在根目录 mvn install,只要 dataark-selfquery 和 dataark-system 没有重新编译(例如没有修改源码,跳过了编译阶段),Maven 就会从本地仓库读取这两个 fat jar 作为依赖,从而导致 dataark-modifier 编译失败。
啊!这很可能是真正的原因!让我重新梳理:
根本原因很可能是:
dataark-selfquery 和 dataark-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-selfquery 和 dataark-system,或者之前一直是在 reactor 中同时编译(此时 Maven 直接使用 target/classes 而不是 jar),或者 dataark-selfquery/dataark-system 之前还没有加 repackage。
不管怎样,现在的解决方案是明确的:
-
修改
dataark-selfquery和dataark-system的pom.xml,给spring-boot-maven-plugin的repackage添加classifier,使普通 jar 保留为可依赖的库。 -
然后从根目录执行
mvn clean install。
或者,另一个方案是将 dataark-selfquery 和 dataark-system 中的共享 API(domain、mapper、pojo 等)拆分到独立的 api 模块中。但这个改动太大了。
最简单有效的修改就是加 classifier。
让我再想想是否还有其他可能...
等等,还有一个可能:dataark-selfquery 和 dataark-system 模块本身编译可能失败了,导致没有生成 jar,或者生成的 jar 不完整。但日志中并没有显示这些模块的编译错误。而且错误信息很明确是 "程序包不存在",不是 "找不到 artifact"。
另外,dataark-selfquery 的包名确实是 com.ruoyi.query,目录结构也证实了这一点。
所以我的最终结论是:
- 根本原因是
dataark-selfquery和dataark-system作为被依赖模块,却配置了spring-boot-maven-plugin的repackage,导致 install 到本地仓库的是 fat jar。 - 触发原因可能是单独 install
dataark-modifier,或者之前 install 的 fat jar 现在被用作了依赖。
我需要给出:
- 原因分析
- 解决方案(修改 pom.xml 加 classifier)
- 也可以建议先从根目录
mvn clean install作为临时方案
另外,我还应该指出根 pom.xml 的 dependencyManagement 缺少 dataark-selfquery 的声明,虽然这不是导致当前编译错误的原因,但建议补上。
让我检查一下根 pom.xml... 确实没有 dataark-selfquery,只有 dataark-system。
好的,我现在就给出完整的分析和解决方案。
修改的文件:
D:\CodingProjects\dataarkser\dataark-modules\dataark-selfquery\pom.xmlD:\CodingProjects\dataarkser\dataark-modules\dataark-system\pom.xml
修改内容:在 spring-boot-maven-plugin 的 repackage 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-selfquery和dataark-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.xml 里 dataark-selfquery 直接写了 <version>1.0.1</version>。如果不改根 pom 也可以。但为了规范,我可以建议加上。
不过,用户现在主要关心的是解决编译错误。我应该聚焦于这个。
让我组织回答:
- 直接指出根本原因:
spring-boot-maven-plugin的repackage把被依赖模块打成了 fat jar。 - 给出修改方案(两个 pom.xml)。
- 给出执行命令建议(先 clean install 被依赖模块,或者从根目录 clean install)。
- 补充建议(根 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-selfquery 和 dataark-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 继承版本。