Java 向库中添加新的依赖项以及兼容的API更改是否会影响二进制兼容性? 我的问题:

Java 向库中添加新的依赖项以及兼容的API更改是否会影响二进制兼容性? 我的问题:,java,c#,binary-compatibility,Java,C#,Binary Compatibility,只要库的外部API是向后兼容的,向库添加新的依赖项是否会影响二进制兼容性 我的情况: My包含用于任意精度算术的类(在PeterO命名空间中)。(在C#和Java中;Java版本在单独的存储库中,但同样的问题适用于这两个版本。) 我已经将这些类移动到一个新的名称空间(在PeterO.Numbers中),并重命名它们(保留原始类以实现向后兼容性),因为它们现在所在的名称空间只包含实用程序类。我计划将新类移动到一个单独的库中,并使CBOR库将该库作为依赖项调用,因为任意精度类在CBOR之外显然很有用

只要库的外部API是向后兼容的,向库添加新的依赖项是否会影响二进制兼容性

我的情况: My包含用于任意精度算术的类(在PeterO命名空间中)。(在C#和Java中;Java版本在单独的存储库中,但同样的问题适用于这两个版本。)

我已经将这些类移动到一个新的名称空间(在PeterO.Numbers中),并重命名它们(保留原始类以实现向后兼容性),因为它们现在所在的名称空间只包含实用程序类。我计划将新类移动到一个单独的库中,并使CBOR库将该库作为依赖项调用,因为任意精度类在CBOR之外显然很有用。(我计划最终废除旧类。)


但我担心的是,如果以这种方式创建一个单独的库是一个二进制兼容性问题,那么我不仅可以更新次要版本,还可以更新主要版本。撰写本文时,CBOR库的版本为2.3.1。我能做到这一点并将版本更改为2.4还是仅3.0?

我将回答Java版本的问题。详细描述在保持二进制兼容性的同时可以对应用程序进行的更改

据我所知,您的更改(尽管它们可能会影响大部分源代码)是简单的重构,将一些实用程序类公开给另一个模块,并重新引导旧类调用这个新模块。这在以下章节中进行了说明:

新的顶级类或接口类型可以添加到包中,而不会破坏与预先存在的二进制文件的兼容性,前提是新类型不会重用以前为不相关类型指定的名称


因此,这不会破坏与使用库的现有类的二进制兼容性。任何用于调用
CBORUtil.doArithmetic()
的现有类
CBORClient
都将继续工作,而无需重新编译它,因为方法仍然存在,只有它的主体已更改为调用另一个模块来进行计算。

在下一个主要版本之前,最好避免添加新的依赖项,直到下一个主要版本,在内部添加更改,使用同一类创建新的任意精度库,并在没有依赖关系的情况下同步它们


因此,对于版本2.4,在新名称空间中添加更改,并从旧类调用它们,为任意精度类创建另一个类库,并将它们同步到CBOR库的下一个主要版本,只要您从一个接口开始,并且所有库的客户端都知道该接口,你会没事的。只要您的库有一个其客户端能够理解的接口,并且它实现了该接口,那么代码驻留在库中或库外的库中的位置并不重要

这是一个由来已久的问题,15年前COM(组件对象模型)已经解决了这个问题。将您的接口与实现分开,您就是黄金