我有以下 API 兼容性问题,正在寻找解决方法。
TL;DR 有没有办法在 Java 中为类创建“别名”? IE。使 com.acme.foo.SomeEnum
成为 com.acme.bar.SomeEnum
的别名的一些技巧?
说来话长。 (我将其匿名化以避免相互指责。)
我正在使用一个功能强大的 Java 工具,它也支持插件。没有严格定义的 public API(从某种意义上说,您可以接触什么,不能接触什么),只有通常的私有(private)/ protected /包/公共(public)类、方法和字段。有定义的扩展点(例如,扩展 com.acme.plugin.Plugin
类),但是您将可以访问该工具的广泛内部结构。
在最近的次要版本更新中(如 1.2.3
-> 1.2.4
),工具开发人员已将一个枚举类移动到另一个包 - com .acme.foo.SomeEnum
变成了 com.acme.bar.SomeEnum
。我认为这只是一个微不足道的重构,而不是一个严肃的重组。
然而,这个类似乎已被许多插件使用。结果是这些插件现在与最新版本不兼容。大多数插件都非常有用,但没有得到积极维护。人们多年前就写了它们——它们只是工作了这么多年,有几十个版本更新。因此,这可能会对工具的插件生态系统产生负面影响。
我的问题是,Java 中是否有某种方法可以为 com.acme.bar.SomeEnum
创建一个“别名”com.acme.foo.SomeEnum
?这将允许旧插件继续使用该工具的新版本。
一些类加载器技巧?在 JavaScript 中这对 shim 来说是微不足道的,但在 Java 中呢?
为什么我要问这个。我是包装相关工具的 Maven 插件的作者。所以我可以很容易地把我的糖加到这杯咖啡里,比如类加载器等等。如果有一种技术方法可以使这项工作发挥作用,我将能够挽救该工具的大部分插件生态系统 - 至少对于 Maven 用户而言。
我已经就此联系了该工具的供应商,但不确定是否成功。
澄清一下 - 我不是相关工具的供应商。我 (a) 为 The Tools 编写插件(更新 my 插件没有大问题)并且 (b) 是 the-tool-maven-plugin
的作者允许执行 Maven 构建中的工具。我也经常咨询 The Tool 并关心它的生态系统(有很多非常有用的插件)。
更新
故事结尾:The Tool 的开发人员考虑了我的观点,并决定恢复更改。为此点赞!
最佳答案
我建议使用 jarjar .这是一个允许您在库中重新打包类的工具。您可以针对最新版本的工具运行它,并将 SomeEnum 类移动到与插件不冲突的包中。
Getting Started doc 有一个示例,其中包含 jaxen.jar,看起来与您的情况相关。
关于java - 有没有办法将 "alias"Java 中的一个类用于另一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433291/