我有以下API兼容性问题,并正在寻找解决方法。
TL;DR:在Java中是否有创建类的“别名”的方法? 例如,有没有一些技巧可以使
长话短说,我正在使用一个功能强大的Java工具,该工具还支持插件。 没有严格定义的公共API(你可以接触和不能接触的),只有私有/受保护/包/公共类、方法和字段。 有定义好的扩展点(例如,扩展
在最近的小版本更新中(例如,
然而,这个类似乎已被许多插件使用。 结果是这些插件现在与最新版本不兼容。 大部分插件非常有用,但并没有积极维护。 人们几年前编写了它们 - 它们在多年的版本更新中工作正常。 因此,这可能对该工具的插件生态系统产生负面影响。
我的问题是,如果有一种方法可以在Java中创建
某些类装入器技巧? 在JavaScript中,这将很容易进行Shim操作,但在Java中呢?
TL;DR:在Java中是否有创建类的“别名”的方法? 例如,有没有一些技巧可以使
com.acme.foo.SomeEnum
成为com.acme.bar.SomeEnum
的别名?长话短说,我正在使用一个功能强大的Java工具,该工具还支持插件。 没有严格定义的公共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用户来说,我将能够保存大多数工具的插件生态系统。
我已经就此联系了该工具的供应商,但不确定是否成功。
请明确一点 - 我不是所讨论工具的供应商。我(a)为该工具编写插件(并没有大问题更新我的插件),(b)是“the-tool-maven-plugin”的作者,该插件允许在Maven构建中执行该工具。我在该工具上也经常进行咨询,并关心其生态系统(有很多非常有用的插件)。
更新
故事结束:该工具的开发人员考虑到了我的观点,并决定撤销更改。为此点赞!
com.acme.foo
包,创建SomeEnum
并查看其余生态系统是否继续工作吗?我从未测试过这样的事情,不知道是否可行。 - Laf