基本上我有包...可能在Java中执行程序包依赖关系层次结构吗?
com.me.application
com.me.application.thing
com.me.library
我想执行的规则,没有什么com.me.application
可以包括com.me.library
,除了在com.me.application.thing
事情。
在Java代码时,Maven,类路径,或Java的任何其他层,这将是大致等价于C连接的水平这是可能的?
基本上我有包...可能在Java中执行程序包依赖关系层次结构吗?
com.me.application
com.me.application.thing
com.me.library
我想执行的规则,没有什么com.me.application
可以包括com.me.library
,除了在com.me.application.thing
事情。
在Java代码时,Maven,类路径,或Java的任何其他层,这将是大致等价于C连接的水平这是可能的?
,我能想到的唯一的办法就是通过AspectJ。
AspectJ是一个方面取向的语言,用来通过单独的编译过程,以横切关注添加到你的应用。 AspectJ的一个经典用途是策略执行,它适合您的场景。
基本上你宣布,从包里面的代码可以被调用,当你遇到一个方法调用(或在您的情况下,变量声明)违反这些规则抛出编译错误决定的规则。你可以学习的优秀图书的详细信息AspectJ in Action
的AspectJ可以很好地集成到一个Maven构建通过AspectJ plugin
而且如果你用AspectJ只执行政策的,你不会有任何额外的运行时依赖,因为你的字节码不会被修改。
您将需要通过独立的Maven项目,每建一个jar文件建立com.me.application,com.me.application.thing和com.me.library。 com.me.application的pom不包含com.me.library的依赖项,而com.me.application.thing的pom将包含com.me.library的依赖项。
但这是一个奇怪的包装结构。你为什么要防止这个?
而不是试图强制编译器来做到这一点,为什么不使用源代码分析呢?
我会建议使用现在嵌入Sonar的architecture rules engine。将此与build breaker插件相结合,如果开发人员违反了您的层次结构规则,则可能触发构建失败。
不知道。太好了! –
您可以使用Checkstyle的import control规则执行检查。将Maven Checkstyle plugin配置到您的pom.xml中,并且可以设置任何违规,导致构建失败。
它根本不是一个奇怪的结构,它确保库的使用在应用程序的一小部分中被隔离,而不是在整个代码中闪烁。绝对希望有一种解决方案不会深入到物理构建结构中。 – djechlin
我想我觉得它很奇怪,因为一个是另一个的一个子包。请注意,Maven解决方案只能防止构建时依赖性。如果你的中间有一些scofflaw开发人员,它不会阻止某人在运行时使用反射。 – jalynn2