可以强制包依赖层次结构在Java中?(Possible to enforce package dep

2019-09-23 02:33发布

基本上我有包...

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

我想执行的规则,没有什么com.me.application可以包括com.me.library ,除了在东西com.me.application.thing

这是可能在Java代码时,Maven,类路径,或Java的任何其他层将大致等价于C连接的水平?

Answer 1:

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

AspectJ是一个方面取向的语言,用来通过单独的编译过程,以横切关注添加到你的应用。 一个AspectJ的经典用途之一是政策执行,这适合您的方案。

基本上你宣布从包里面的代码可以被调用,当你遇到一个方法调用(或在您的情况下,变量声明)违反这些规则抛出编译错误决定的规则。 你可以学习的细节的优秀图书的AspectJ在行动

AspectJ中可以很好地集成到一个Maven通过建立AspectJ的插件

如果你用AspectJ只执行政策的,你不会有任何额外的运行时依赖,因为你的字节代码将不会被修改。



Answer 2:

而不是试图强制编译器做,为什么不使用源代码分析呢?

我会建议使用的架构规则引擎是现在嵌在声纳 。 与此相结合构建断路器插件,你可以触发一个构建失败,如果开发商违反您的层次结构的规则。



Answer 3:

您可以强制与Checkstyle的的支票进口管制规则。 配置的Maven插件Checkstyle的进入你的pom.xml,任何违规行为可以被设置为使构建失败。



Answer 4:

您将需要通过独立的Maven项目,每建一个jar文件建立com.me.application,com.me.application.thing和com.me.library。 对于com.me.application聚甲醛将不包括依赖性com.me.library,并com.me.application.thing将包括com.me.library依赖的POM。

但是,这是一个奇怪的封装结构。 你为什么要阻止呢?



文章来源: Possible to enforce package dependency hierarchy in Java?