基本上我有包...
com.me.application
com.me.application.thing
com.me.library
我想强制执行规则中的任何内容都com.me.application
不能包含com.me.library
,除了com.me.application.thing
.
这在 Java 代码、Maven、类路径或任何其他大致相当于 C 语言链接的 Java 层上是否可行?
基本上我有包...
com.me.application
com.me.application.thing
com.me.library
我想强制执行规则中的任何内容都com.me.application
不能包含com.me.library
,除了com.me.application.thing
.
这在 Java 代码、Maven、类路径或任何其他大致相当于 C 语言链接的 Java 层上是否可行?
您可以使用 Checkstyle 的导入控制规则强制执行检查。将Maven Checkstyle 插件配置到您的 pom.xml 中,任何违规都可以设置为导致构建失败。
我能想到的唯一方法是通过AspectJ。
AspectJ 是一种面向方面的语言,用于通过单独的编译过程将横切关注点添加到您的应用程序中。AspectJ 的经典用途之一是策略执行,它适合您的场景。
基本上,您声明的规则决定可以从哪个包调用哪些代码,并在遇到违反这些规则的方法调用(或在您的情况下为变量声明)时抛出编译错误。您可以在优秀的书籍AspectJ in Action中了解详细信息
AspectJ 可以通过AspectJ 插件很好地集成到 Maven 构建中
如果您仅将 AspectJ 用于策略实施,您将不会有任何额外的运行时依赖项,因为您的字节码不会被修改。
您需要通过单独的 maven 项目构建 com.me.application、com.me.application.thing 和 com.me.library,每个项目都构建一个 jar 文件。com.me.application 的 pom 将不包含对 com.me.library 的依赖,而 com.me.application.thing 的 pom 将包含对 com.me.library 的依赖。
但这是一个奇怪的包结构。为什么要阻止这种情况?