2010-01-11 9 views
17

Quiero verificar la compatibilidad binaria entre 2 JAR.Cómo identificar un método faltante (compatibilidad binaria) en un JAR estáticamente

Siguiendo las sugerencias en este answer utilicé jboss tattletale pero puede encontrar las clases que faltan.

¿Cómo puedo saber si faltan métodos? ¿Es posible?

E.g.

"Depende - en la" clase Foo depende de Bar (al igual que muchos otros trabajadores de la 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 
    } 
} 

"tiempo de compilación" clase

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 imaginemos una de edad La jarra de barras está reemplazando cada vez más la barra de tiempo compilada:

"tiempo de ejecución" clase

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 una manera de identificar el método que falta sin ejecutarlo y conseguir un NoSuchMethodError?


Negación: Se trata de una reformulación importante de mi propia related question, que es imborrable. Elegí hacer una nueva pregunta porque la reformulación hará que las 2 respuestas actuales no tengan ninguna relación con el tema.

+0

se puede comentar sobre la otra cuestión que debe ser cerrado, y superusuarios puede cerrarla para que – Yoni

+0

@Yoni - ya lo ha hecho –

+0

"sin ejecutarlo" == "estática" (en el título de que se trate) – aponomarenko

Respuesta

15

japi-compliance-checker - API atrás/ABI comprobador de compatibilidad para una biblioteca de Java:

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

enter image description here

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

japitools - comprueba la compatibilidad entre las API de Java

japi-checker - un retroceso comprobador de compatibilidad API de Java que funciona a nivel binario

revapi - análisis de activos y de cambio de herramienta de seguimiento

o manualmente usando decompilador javap :

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

¡Hola! chicos puedo tener un pequeño ejemplo para esto. es decir, en qué base está comparando. ¿Cómo puedo obtener todos los detalles de depuración en la pantalla? – picnic4u

+0

@ picnic4u - use la opción '--debug' adicional de la herramienta' japi-compliance-checker' para generar salida javap intermedia al subdirectorio 'debug /'. – aponomarenko

+0

muchas gracias ahora obtengo todos los detalles con la versión 1.1.2 – picnic4u

1

Hay una herramienta con el nombre 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 adhieren a la firma, y ​​puede verificar de manera estática que los implementadores de la API tienen todo implementado. Creo que esto resolvería tu problema muy bien.

Puede descargar el tarro de Animal Sniffer desde el repositorio Maven Codehaus: http://repository.codehaus.org/org/codehaus/mojo/animal-sniffer/

+0

@Michael - encontraste un enlace de descarga? ¿Dónde se esconde? –

+1

La herramienta está escrita por gente de Maven, así que creo que solo usan varios repositorios maven, lo que es fácil en Maven. No es tan fácil en 'hormiga' por desgracia. –

+0

No lo he probado todavía, pero esta es la mejor respuesta hasta el momento, añadiré un comentario una vez que lo pruebe. –

0

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

+1

@Shlomo - Gracias, lo necesito para muchas clases en muchos JARs –

3

Clirr - comprueba las bibliotecas de Java para la compatibilidad binaria y la fuente con versiones anteriores:

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

Gracias, ¿por qué dos respuestas por separado? –

+0

@EranMedan Hm, no recuerdo el motivo =) – aponomarenko

3

Revapi ca n hacer el trabajo, también. Es fácil incorporarlo a las construcciones maven, que obviamente no es su caso, pero podría ser de interés para otros.

También puede verificar conjuntos arbitrarios de jar utilizando su modo independiente.

+0

El proyecto no tiene ningún "descargable" - o, no pude encontrar un enlace en su sitio web principal – Jayan

+0

La sección de descarga ahora está allí en el sitio renovado: http : //revapi.org/downloads.html – metlos

3

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

+0

No se olvide de revelar su afiliación con los proyectos o blogs que menciona en sus publicaciones. Agregue la divulgación adecuada a [todos los tres] (http://stackoverflow.com/search?q=user%3A2833924+url%3Ajapicmp) de dichas respuestas. Además, si recomienda una herramienta o biblioteca, debe mostrar cómo se puede aplicar. –

Cuestiones relacionadas