Sua biblioteca recém-empacotada não é compatível com binários anteriores (BC) com a versão antiga. Por esse motivo, alguns dos clientes da biblioteca que não são recompilados podem lançar a exceção.
Este é um completo lista das alterações na API da biblioteca Java que podem fazer com que os clientes criados com uma versão antiga da biblioteca atinjam java.lang. IncompatibleClassChangeError se eles rodarem em um novo (por exemplo, quebrando o BC):
- O campo não final se torna estático,
- O campo não constante se torna não estático,
- A classe se torna interface,
- Interface se torna classe,
- se você adicionar um novo campo à classe / interface (ou adicionar nova superclasse / super interface), um campo estático de uma super interface de uma classe cliente C poderá ocultar um campo adicionado (com o mesmo nome) herdado do superclasse de C (caso muito raro).
Nota : Existem muitas outras exceções causadas por outras alterações incompatíveis: NoSuchFieldError , NoSuchMethodError , IllegalAccessError , InstantiationError , VerifyError , NoClassDefFoundError e AbstractMethodError .
O melhor artigo sobre BC é "Evoluindo APIs baseadas em Java 2: Atingindo a compatibilidade binária da API" escrito por Jim des Rivières.
Existem também algumas ferramentas automáticas para detectar essas alterações:
Uso do japi-compliance-checker na sua biblioteca:
japi-compliance-checker OLD.jar NEW.jar
Uso da ferramenta clirr:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Boa sorte!