我有一个多模块 Maven 项目,包含模块“app”和“域”。应用程序依赖于域。域模块具有公共和私有代码。公共代码位于包 **/domain/api/**
中。
在Domain 模块的pom 中,我为maven jar 插件添加了一个执行,它生成了一个带有分类器'api'(仅包含公共类)的附加项目工件。
在 App 模块中,我在域模块上添加了一个“运行时”范围的依赖项(因此所有类都在运行时出现),并且我在分类的“API”上添加了一个编译时范围的依赖项。这是为了确保应用模块只能从域中访问公共 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>
答案 0 :(得分:0)
Intellij 在处理复杂的 Maven 依赖项时遇到问题。尤其是当您尝试过滤原始项目时。
我对 test-jar
(the easy-way) 有同样的问题,因为 Intellij 忽略了排除。 IDEA-204719 跟踪进度。
khmrbase 在评论中是正确的。您应该为您的 API 创建一个单独的项目。这种方法的唯一缺点是您必须为 api 实现共享测试代码复制(或进一步复杂化您的模块)。对此的解决方案可能是 test-jar
,正如我所解释的,它在 Intellij 中无法正常工作。