2012-09-27 21 views
1

基本上我有包...可能在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连接的水平这是可能的?

回答

2

,我能想到的唯一的办法就是通过AspectJ

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

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

的AspectJ可以很好地集成到一个Maven构建通过AspectJ plugin

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

0

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

但这是一个奇怪的包装结构。你为什么要防止这个?

+1

它根本不是一个奇怪的结构,它确保库的使用在应用程序的一小部分中被隔离,而不是在整个代码中闪烁。绝对希望有一种解决方案不会深入到物理构建结构中。 – djechlin

+1

我想我觉得它很奇怪,因为一个是另一个的一个子包。请注意,Maven解决方案只能防止构建时依赖性。如果你的中间有一些scofflaw开发人员,它不会阻止某人在运行时使用反射。 – jalynn2

3

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

我会建议使用现在嵌入Sonararchitecture rules engine。将此与build breaker插件相结合,如果开发人员违反了您的层次结构规则,则可能触发构建失败。

+0

不知道。太好了! –