java - 具有分类依赖的 Intellij Maven 多模块项目
问题描述
我有一个多模块 Maven 项目,带有模块“应用程序”和“域”。应用程序取决于域。域模块具有公共和私有代码。公共代码在包中**/domain/api/**
。
在 Domain 模块的 pom 中,我为 maven jar 插件添加了一个执行,它生成了一个带有分类器“api”(仅包含公共类)的附加项目工件。
在 App 模块中,我在 Domain 模块上添加了一个“运行时”范围的依赖项(因此所有类都存在于运行时),并在分类的“API”上添加了一个编译时范围的依赖项。这是为了确保 App 模块只访问域中的公共 api 代码。
一切都编译并运行。我已经从域模块中检查了 api 工件的内容,它只包含打算公开的代码。
但在 IntelliJ 中,我仍然可以使用(导入)私有包中的域代码。IntelliJ 似乎忽略了分类器部分。因此,当我引用私有代码(恕我直言,这是错误的)并且 Maven 构建失败(这很好)时,IntelliJ 会编译。
这是 IntelliJ 问题还是我遗漏了什么?
de App 模块中的相关 pom 部分:
<dependency>
<groupId>com.acme</groupId>
<artifactId>sbp-domain</artifactId>
<version>${project.version}</version>
<classifier>api</classifier>
</dependency>
<dependency>
<groupId>com.acme</groupId>
<artifactId>sbp-domain</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
解决方案
Intellij 在处理复杂的 Maven 依赖项时遇到了麻烦。特别是如果您尝试过滤原始项目。
由于 Intellij 忽略了排除,我对test-jar
(简单方法)有同样的问题。IDEA-204719跟踪进度。
khmrbase在评论中是正确的。您应该为您的 API 创建一个单独的项目。该方法的唯一缺点是您必须为 api 实现共享测试代码复制(或使您的模块进一步复杂化)。正如我所解释的那样,解决方案可能test-jar
在 Intellij 中无法正常工作。
推荐阅读
- acumatica - 正在为项目复制的隐藏字段
- testing - TestCafe 屏幕截图给出错误错误:未在 WebSocket.send 处打开
- html - 如何对齐文本框?
- mysql - FIX MYSQL UPDATE INNER JOIN 和 ORDER BY QUERY 和 SET VARIABLE
- javascript - 如何生成类似于有效数据的模糊字符串来测试输入验证
- python - 类中未定义的列不存在?
- python - 如何更改 CUDA_CACHE_MAXSIZE NVIDIA
- node.js - MongoDB 部署不支持可重试写入
- android - 为 Android 构建 Qt 5.15 应用程序的多个链接错误
- r - 如何按目标向量给出的列值重新排序数据帧