java - 有没有办法将 "alias"Java 中的一个类用于另一个类?

标签 java

我有以下 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/

相关文章:

java - 配置 hibernate (使用 JPA)以存储 boolean 类型的 Y/N 而不是 0/1

java - 每次点击按钮读取每 5 行

java - 如何修复 Java 中的 Ldap 连接错误 "javax.naming.SizeLimitExceededException: [LDAP: error code 4 - Sizelimit Exceeded]"?

java - 由于我添加了验证 if 语句,应用程序无法运行

java - p4java 程序将文件从工作区/客户端提交到软件仓库

java - 二维数组行列长度

java - 将昂贵的资源创建放在静态 block 中?

java - 为什么不推荐使用 (javax.servlet.)SingleThreadModel?

java - 合并集合图

java - 计算哈希集中的数字被选取的频率