我遇到以下API兼容性问题并寻找解决方法。
TL; DR有没有办法在Java中为类创建“别名”?即让com.acme.foo.SomeEnum
成为com.acme.bar.SomeEnum
的别名的一些技巧?
长篇故事。 (我为了避免指点而对它进行了一些调整。)
我正在使用一个强大的Java工具,它也支持插件。没有严格定义的 public API(从某种意义上说,你能够和不能触摸),只是通常的私有/受保护/包/公共类,方法和字段。有定义的扩展点(比如,扩展com.acme.plugin.Plugin
类),但是你可以访问工具内部的广泛区域。
在最近的次要版本更新(例如,1.2.3
- > 1.2.4
)工具开发人员已将一个枚举类移至另一个包 - com.acme.foo.SomeEnum
变为com.acme.bar.SomeEnum
。我认为它被认为是一个微不足道的重构,而不是一个严重的重组。
然而,这个类似乎已被许多插件使用。结果是这些插件现在与最新版本不兼容。大多数插件非常有用,但没有主动维护。人们在几年前写了他们 - 他们刚刚工作了多年,有几十个版本更新。因此,这可能会对工具的插件生态系统产生负面影响。
我的问题是,如果在Java中有某种方式为com.acme.foo.SomeEnum
创建“别名”com.acme.bar.SomeEnum
?这将允许旧插件继续使用新版本的工具。
一些类加载器技巧?在JavaScript中,这对于shim来说是微不足道的,但在Java中呢?
为什么我问这个问题。我是Maven插件的作者,它包含了有问题的工具。所以我可以轻松地将糖添加到这种咖啡中,就像类加载器一样。如果有技术方法可以实现这一目标,那么我将能够保存大部分工具的插件生态系统 - 至少对于Maven用户而言。
我已经联系了该工具的供应商,但不确定是否成功。
只是为了说清楚 - 我我不有问题的工具的供应商。我(a)为The Tools编写插件(并且在更新我的插件时没有遇到大麻烦)和(b)我是the-tool-maven-plugin
的作者,允许在Maven构建中执行该工具。我也就The Tool进行了很多咨询并关注它的生态系统(有很多非常有用的插件)。
更新
故事结束:The Tool的开发人员考虑了我的观点,并决定恢复变更。为此感到荣幸!
答案 0 :(得分:4)
我建议使用jarjar。这是一个允许您重新打包库中的类的工具。您可以针对该工具的最新版本运行此操作,并将SomeEnum类移动到与插件不冲突的包中。
Getting Started doc有一个jaxen.jar示例,它看起来与您的情况相关。