3

基本上我有包...

com.me.application
com.me.application.thing
com.me.library

我想强制执行规则中的任何内容都com.me.application不能包含com.me.library,除了com.me.application.thing.

这在 Java 代码、Maven、类路径或任何其他大致相当于 C 语言链接的 Java 层上是否可行?

4

4 回答 4

4

与其试图强迫编译器去做,为什么不使用源代码分析呢?

我建议使用现在嵌入在Sonar中的架构规则引擎。将此与构建破坏插件结合使用,如果开发人员违反您的层次结构规则,您可以触发构建失败。

于 2012-09-27T17:56:46.707 回答
3

您可以使用 Checkstyle 的导入控制规则强制执行检查。将Maven Checkstyle 插件配置到您的 pom.xml 中,任何违规都可以设置为导致构建失败。

于 2013-02-26T16:47:50.797 回答
2

我能想到的唯一方法是通过AspectJ

AspectJ 是一种面向方面的语言,用于通过单独的编译过程将横切关注点添加到您的应用程序中。AspectJ 的经典用途之一是策略执行,它适合您的场景。

基本上,您声明的规则决定可以从哪个包调用哪些代码,并在遇到违反这些规则的方法调用(或在您的情况下为变量声明)时抛出编译错误。您可以在优秀的书籍AspectJ in Action中了解详细信息

AspectJ 可以通过AspectJ 插件很好地集成到 Maven 构建中

如果您仅将 AspectJ 用于策略实施,您将不会有任何额外的运行时依赖项,因为您的字节码不会被修改。

于 2012-09-27T14:51:13.273 回答
0

您需要通过单独的 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 的依赖。

但这是一个奇怪的包结构。为什么要阻止这种情况?

于 2012-09-27T14:50:41.647 回答