有没有办法在Java中为一个类“别名”另一个?

时间:2014-12-11 22:05:06

标签: java

我遇到以下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的开发人员考虑了我的观点,并决定恢复变更。为此感到荣幸!

1 个答案:

答案 0 :(得分:4)

我建议使用jarjar。这是一个允许您重新打包库中的类的工具。您可以针对该工具的最新版本运行此操作,并将SomeEnum类移动到与插件不冲突的包中。

Getting Started doc有一个jaxen.jar示例,它看起来与您的情况相关。