在我的项目中,我们有大约20个不同的模块打包成单独的jar,每个jar文件都有一些包。这些包中的一些类是公共的,因此在包外可见,即使这些类应该被视为模块的私有。
鉴于Java没有内置模块系统,我不想将OSGI引入我的应用程序。我正在寻找@Override注释的内容,我可以坚持使用类型来声明它们是模块的私有。然后让一些注释处理器强制执行这些规则。
以下几行。
@ModuleDefinition
public class FooModule{} // empty marker class so it can be referenced by other annotations
@ModulePrivate(FooModule.class)
public class SomePrivateFooModuleClas{}
@ModulePublic(FooModule.class)
public class SomePublicFooModuleClass{}
让我们说下面的代码位于另一个模块
中 @ModuleDefinition
public class BarModule{}
// the annotation processor should generate an error on the import
// statement below because the class being imported is module private
// and the class that the import belong to is not in the same module
import com.example.SomePrivateFooModuleClass;
@ModulePrivate(BarModule.class)
public class SomePrivateBarModuleClas{
SomePrivateFooModuleClass foo = ... etc
}
是否有任何开源库/注释处理器按照我上面概述的方式执行某些操作。
如上所述的这种方案是否可以由注释处理器实现,或者它是否超出了注释处理器的设计功能。
我不关心模块的运行时隔离,停止和重新加载模块,或osgi带来的任何其他强大功能,我只是希望开发人员不要偶然使用模块私有类。
答案 0 :(得分:0)
我实现了类似于你想要的东西。我没有使用注释处理器,而是使用ASM来解析类文件。请查看http://www.jabsaw.org
我采用了与您概述的方法略有不同的方法:模块也被定义为空标记类,但注释定义了哪些类属于模块(默认情况下,同一包中的所有类)。此外,每个模块都定义了它导入的模块。只能使用导入模块中的类。
所以我的方法更倾向于依赖组织。
但是,您可以重复使用解析代码,无论是复制/粘贴方式还是重构方式。
如果我理解正确,您的模块目前由您的罐子代表。使用解析代码,您可以解析所有jar中的所有类,确定类依赖关系并跟踪解析类的jar。
使用不带参数的@JarPrivate
,然后可以检查是否有任何类使用来自另一个jar的@JarPrivate
类。
如果您仍感兴趣,请告诉我,我很乐意为您进行必要的重构。