Digo compilo mis clases contra lib_v1.0.jar
y distribuir mis binarios. Entonces puedo actualizar a lib_v1.1.jar
. Suponiendo que mi código fuente se compila contra v1.1 sin errores, ¿mis viejos binarios distribuidos siempre trabajo con lib_v1.1.jar
o tengo que volver a compilar y redistribuir nuevos binarios?
He leído sobre https://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html pero no pude encontrar una respuesta clara o explícita a mi pregunta.
Fuente compatibilidad no implica la compatibilidad binaria.
Por ejemplo, hemos interfaz en la biblioteca siguiente:
// jar v1.0
interface Service {
int calculate(); // signature: ()I
}
Un llamamos desde nuestro código:
Service service = ...
int a = service.calculate(); // calls calculate()I method
En la versión v1.1 código de la biblioteca se ha modificado ligeramente:
// jar v1.1
interface Service {
Integer calculate(); // signature: ()Ljava.lang.Integer;
}
El código fuente sigue siendo compatible, gracias a autoboxing, pero si corremos nuestro código con la nueva versión de la biblioteca se producirá un error con java.lang.NoSuchMethodError: error Service.calculate () I.
Cuestiones similares pueden ser causados por los alcances lambda, genéricos fundido, el tipo implícito moldes etc.