可以在Java中强制执行包依赖层次结构吗?

问题描述 投票:0回答:5
基本上我都有包裹...

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 maven dependencies package
5个回答
4
投票
与其试图强制编译器这样做,为什么不使用源代码分析呢?

我建议使用现在嵌入到

Sonar中的架构规则引擎。将此与 build Breaker 插件结合使用,如果开发人员违反您的层次结构规则,您可以触发构建失败。


3
投票

2
投票
我能想到的唯一方法是通过

AspectJ

AspectJ 是一种面向方面的语言,用于通过单独的编译过程将横切关注点添加到应用程序中。 AspectJ 的经典用途之一是策略执行,这适合您的场景。

基本上,您声明了决定从哪个包调用哪些代码的规则,并在遇到违反这些规则的方法调用(或者在您的情况下是变量声明)时抛出编译错误。您可以在优秀书籍

AspectJ in Action中了解详细信息

AspectJ 可以通过

AspectJ 插件很好地集成到 Maven 构建中

如果您仅使用 AspectJ 来执行策略,则不会有任何额外的运行时依赖项,因为您的字节代码不会被修改。


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 的依赖。

但是这是一个奇怪的包结构。为什么要阻止这种情况发生?


0
投票
现在我会推荐

ArchUnit——多么棒的易于使用的库。

© www.soinside.com 2019 - 2024. All rights reserved.