基本上我有包......
com.me.application
com.me.application.thing
com.me.library
除了com.me.application
中的内容之外,我想强制执行com.me.library
中的任何内容都不能包含com.me.application.thing
的规则。
这是否可以在Java代码,Maven,类路径或任何其他Java层中与C中的链接大致相同?
答案 0 :(得分:3)
为什么不使用源代码分析代替尝试强制编译器呢?
我建议您使用architecture rules engine中嵌入的Sonar。将此与build breaker插件结合使用,如果开发人员违反了您的层次结构规则,则可以触发构建失败。
答案 1 :(得分:2)
我能想到的唯一方法是AspectJ。
AspectJ是一种面向方面的语言,用于通过单独的编译过程将横切关注点添加到应用程序中。 AspectJ的一个经典用途是策略实施,适合您的场景。
基本上,您声明的规则决定了哪个包可以调用哪个代码,并在遇到违反这些规则的方法调用(或者在您的情况下是变量声明)时抛出编译错误。您可以在优秀的书籍AspectJ in Action
中了解详情 可以很好地将AspectJ集成到Maven构建中如果您仅将AspectJ用于策略实施,则不会有任何其他运行时依赖性,因为您的字节代码不会被修改。
答案 2 :(得分:2)
您可以使用Checkstyle的import control规则强制执行检查。将Maven Checkstyle plugin配置到您的pom.xml中,并且可以设置任何违规以使构建失败。
答案 3 :(得分: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的依赖项。
但这是一个奇怪的包结构。为什么要阻止这种情况?