java jar static-analysis bytecode binary-compatibility

java - Cómo identificar un método faltante(Compatibilidad binaria) en un JAR estáticamente



static-analysis bytecode (6)

¿Necesita una para verificar una clase específica o una herramienta genérica para comparar jar''s? Si es para 1 clase, simplemente cargue la clase en un cargador de clases personalizado, verifique la firma de los métodos utilizando la reflexión y eso es todo. Si lo necesitas para muchos JAR''s / Classes esto será demasiado trabajo.

Quiero verificar la compatibilidad binaria entre 2 JARs.

Siguiendo las sugerencias de esta answer , utilicé jboss tattletale pero solo puedo encontrar clases faltantes.

¿Cómo puedo encontrar si faltan métodos? ¿Es posible en absoluto?

P.ej

"Depende de" la clase Foo depende de Bar (como muchos otros trabajadores de clase media)

import org.overlyusedclassnames.Bar public class Foo{ public void someMethod(){ Bar tender = new Bar(); tender.getJohnnyRedLabel(); tender.getJohnnyBlueLabel(); //this method is new in the Bar class } }

Clase de "tiempo de compilación"

package org.overlyusedclassnames; /** * @Since 1992 * Changes: added blue and gold Johnny Walker labels */ public class Bar { public Drink getJohnnyRedLabel(){ return new JohnyWalkerFactory.get(RedLabel.class); } public Drink getJohnnyBlackLabel(){ return new JohnyWalkerFactory.get(BlackLabel.class); } public Drink getJohnnyGoldLabel(){ return new JohnyWalkerFactory.get(GoldLabel.class); } public Drink getJohnnyBlueLabel(){ return new JohnyWalkerFactory.get(BlueLabel.class); } }

Ahora imagine que un viejo tarro de Bar está reemplazando accidentalmente la barra de tiempo compilada:

Clase "Tiempo de ejecución"

package org.overlyusedclassnames; /** * @Since 1909 * Changes: added red and black Johnny Walker labels */ public class Bar { public Drink getJohnnyRedLabel(){ return new JohnyWalkerFactory.get(RedLabel.class); } public Drink getJohnnyBlackLabel(){ return new JohnyWalkerFactory.get(BlackLabel.class); } }

¿Hay alguna forma de identificar el método faltante sin ejecutarlo y obtener un NoSuchMethodError ?

Descargo de responsabilidad : Esta es una importante reformulación de mi propia pregunta relacionada , que es imposible de recuperar. Elegí hacer una nueva pregunta porque la reformulación hará que las 2 respuestas actuales no tengan ninguna relación con el tema.


Existe una herramienta con el nombre de Animal Sniffer que le permite extraer una firma para una API. Luego, puede verificar de manera estática que los usuarios de la API se adhieran a la firma, y ​​puede verificar de manera estática que los implementadores de la API tengan todo lo implementado. Creo que esto resolvería tu problema muy bien.

Puede descargar el frasco para Animal Sniffer del repositorio de codehaus maven: http://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer/


Clirr : verifica las bibliotecas de Java para verificar la compatibilidad de fuentes y binarios con versiones anteriores:

java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar


revapi puede hacer el trabajo, también. Es fácil incorporarlo en las versiones de Maven, que obviamente no es su caso, pero puede ser de interés para otros.

También puede verificar conjuntos arbitrarios de tarros usando su modo independiente.


japi-compliance-checker - japi-compliance-checker API / ABI hacia atrás para una biblioteca Java:

japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar

sigtest - herramienta de conformidad de API y pruebas de firma SigTest de Oracle

japitools - prueba de compatibilidad entre las API de Java

japi-checker : un comprobador de compatibilidad con versiones anteriores de la API de Java que funciona a nivel binario

revapi - API de análisis y herramienta de seguimiento de cambios

o manualmente usando javap decompiler:

javap OLD.class > OLD.txt javap NEW.class > NEW.txt diff -rNau OLD.txt NEW.txt > CHANGES.txt


japicmp es otra herramienta para verificar la compatibilidad binaria. Está disponible como herramienta de línea de comandos independiente o como complemento de Maven.