Su biblioteca recién empaquetada no es compatible con binarios anteriores (BC) con la versión anterior. Por esta razón, algunos de los clientes de la biblioteca que no se vuelven a compilar pueden generar la excepción.
Esta es una lista completa de los cambios en la API de la biblioteca Java que pueden hacer que los clientes compilados con una versión anterior de la biblioteca arrojen java.lang. IncompatibleClassChangeError si se ejecutan en uno nuevo (es decir, romper BC):
- El campo no final se vuelve estático,
- El campo no constante se vuelve no estático,
- La clase se convierte en interfaz,
- La interfaz se convierte en clase,
- si agrega un nuevo campo a la clase / interfaz (o agrega una nueva superclase / superinterfaz), un campo estático de una superinterfaz de un cliente de clase C puede ocultar un campo agregado (con el mismo nombre) heredado del superclase de C (caso muy raro).
Nota : Hay muchas otras excepciones causadas por otros cambios incompatibles: NoSuchFieldError , NoSuchMethodError , IllegalAccessError , InstantiationError , VerifyError , NoClassDefFoundError y AbstractMethodError .
El mejor artículo sobre BC es "Evolución de las API 2 basadas en Java: lograr la compatibilidad binaria de API", escrito por Jim des Rivières.
También hay algunas herramientas automáticas para detectar tales cambios:
Uso de japi-compliance-checker para su biblioteca:
japi-compliance-checker OLD.jar NEW.jar
Uso de la herramienta clirr:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
¡Buena suerte!