限制Java包之间的依赖关系
在Java构建系统中对软件包依赖项实施限制的可能性有哪些?例如,不应允许" myapp.server.bl.Customer"类引用" myapp.client.ui.customlayout"包。
我对基于Ant或者特定于IDE的解决方案感兴趣。
我想在构建中得到一条错误消息,指示已违反(自定义)包依赖规则,并且构建中止。我还希望在Ant脚本或者IDE项目文件之外的列表中(最好在文本文件中)维护依赖项。
(我不知道Maven,但是我在这里已经读过它对模块依赖管理有更好的支持)
解决方案
我相信Checkstyle对此进行了检查。
叫做导入控制
Eclipse通过构建路径属性/ jar属性对此提供了支持。我认为它可能仅在jar /项目边界上有效。
我们可以配置Eclipse项目以指定访问规则。访问规则可以使用通配符规则指定"禁止","禁止使用"和"可访问"级别。然后,我们可以配置在构建过程中将"不鼓励"或者"禁止"的违规标记为警告或者错误。
关于该想法的一篇旧文章(详细信息可能已过时):
http://www.eclipsezone.com/eclipse/forums/t53736.html
如果使用的是Eclipse(或者OSGi)插件,则显式定义插件/模块的"公共"部分,这是模型的一部分。
常春藤似乎是解决问题的好方法(如果我们使用的是蚂蚁)。 Ivy是Ant的正式依赖管理组件,因此可以与ant很好地集成。它能够解决依赖关系,处理冲突,创建排除等。
它使用简单的xml结构来描述依赖关系,并且比Maven更易于使用,因为它仅尝试解决依赖关系解析问题。
从常春藤主页:
Ivy是用于管理(记录,跟踪,解决和报告)项目依赖项的工具。它具有以下特点:
- 灵活性和可配置性-Ivy本质上与过程无关,并且不依赖于任何方法或者结构。相反,它提供了必要的灵活性和可配置性,以适应各种依赖性管理和构建过程。
- 与Apache Ant紧密集成-尽管Ivy作为独立工具提供,但与Apache Ant的配合特别好,它提供了许多强大的Ant任务,从依赖关系解析到依赖关系报告和发布。
对于特定于IDE的解决方案,IntelliJ IDEA具有依赖关系分析工具,该工具也可以用来定义无效的依赖关系。
http://www.jetbrains.com/idea/webhelp2/dependency-validation-dialog.html
在编辑依赖类时(在右侧错误栏中显示为错误/警告条纹),在编译和实时运行时都将显示依赖关系违规。
使用JetBrains的TeamCity构建服务器可以获得更高的自动化程度,该服务器可以运行检查构建并报告上述已配置的检查。
对于另一种独立于IDE的解决方案,可以使用AspectJ声明无效的依赖关系(并将该步骤集成到构建过程中,以便获取有关问题的警告/错误信息)。
我们可以在IDEA或者Maven中使用多个模块,或者在Eclipse和Gradle中使用多个项目。在所有情况下,该概念都是相同的。
一个简单的解释将是myapp.server.bl的模块,另一个是myapp.client.ui.customlayout的模块,而这两个模块之间都没有编译时相关性。现在,任何尝试根据相反的模块/项目编译代码或者代码完成的尝试都将失败。
要审核问题的严重程度,IntelliJ IDEA的一个有用的起点是分析依赖关系:
http://www.jetbrains.com/idea/webhelp/analyzing-dependencies.html
从该文章中,我们可以看到如何运行项目的依赖关系分析并对其进行操作。