com.me.application
com.me.application.thing
com.me.library
我想强制执行以下规则:
com.me.application
中的任何内容都不能包含
com.me.library
,除了
com.me.application.thing
中的内容。这在 Java 代码、Maven、类路径或任何其他 Java 层(大致相当于 C 中的链接)是否可能?
我建议使用现在嵌入到
Sonar中的架构规则引擎。将此与 build Breaker 插件结合使用,如果开发人员违反您的层次结构规则,您可以触发构建失败。
import control 规则强制执行检查。 将 Maven Checkstyle 插件配置到 pom.xml 中,任何违规都可以设置为导致构建失败。
AspectJ。
AspectJ 是一种面向方面的语言,用于通过单独的编译过程将横切关注点添加到应用程序中。 AspectJ 的经典用途之一是策略执行,这适合您的场景。基本上,您声明了决定从哪个包调用哪些代码的规则,并在遇到违反这些规则的方法调用(或者在您的情况下是变量声明)时抛出编译错误。您可以在优秀书籍AspectJ 可以通过 如果您仅使用 AspectJ 来执行策略,则不会有任何额外的运行时依赖项,因为您的字节代码不会被修改。
但是这是一个奇怪的包结构。为什么要阻止这种情况发生?
ArchUnit——多么棒的易于使用的库。