Como identificar um método faltando (compatibilidade binária) em um JAR estaticamente
-
19-09-2019 - |
Pergunta
Eu quero verificar a compatibilidade binária entre 2 JARs.
Seguindo as sugestões nesta resposta href="https://stackoverflow.com/questions/972087/how-can-i-visualize-jar-not-plugin-dependencies/972199#972199"> Eu costumava jboss tattletale mas posso encontrar somente as classes ausentes.
Como posso descobrir se existem métodos que faltam? É possível em tudo?
por exemplo.
"Depende - em" class Foo depende Bar (como muitos outros trabalhadores de classe média)
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
}
}
classe "tempo de compilação"
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);
}
}
Agora imagine um velho Bar frasco é accedently substituir a barra de tempo compilado:
classe "Runtime tempo"
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);
}
}
Existe uma maneira para identificar o método faltando sem executá-lo e obter um NoSuchMethodError
?
Aviso : Esta é uma grande reformulação do meu próprio pergunta relacionada , que é undeletable. Eu escolhi fazer uma nova pergunta porque a reformulação vai tornar os atuais 2 respostas como bastante não relacionado ao tópico.
Solução
Japi-conformidade-checker - API para trás / verificador de compatibilidade ABI para uma biblioteca Java :
japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar
sigtest - da Oracle SigTest testes assinatura e ferramenta API conformidade
japitools - teste de compatibilidade entre APIs Java
Japi-checker - um verificador de compatibilidade com versões anteriores java API que funciona a nível binário
revapi - análise API e ferramenta de controle de alterações
usando ou manualmente javap decompiler:
javap OLD.class > OLD.txt javap NEW.class > NEW.txt diff -rNau OLD.txt NEW.txt > CHANGES.txt
Outras dicas
Clirr - verificações Java bibliotecas para compatibilidade binária e fonte com versões mais antigas:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Revapi pode fazer o trabalho também. É fácil incorporá-lo em Maven constrói, o que não é o seu caso, obviamente, mas pode ser de interesse para os outros.
Ele também pode verificar conjuntos arbitrários de frascos usando seu modo independente.
japicmp é outra ferramenta para verificar a compatibilidade binária. Ele está disponível como ferramenta de linha de comando independente ou como maven plugin.
Há uma ferramenta com o nome de animal Sniffer que permite que você extraia uma assinatura para uma API. Então, ele pode estaticamente verificar se os usuários da vara API para a assinatura, e pode estaticamente verificar que os implementadores da API têm tudo implementadas. Eu acho que isso iria resolver o seu problema muito bem.
Você pode baixar o jar para Sniffer animal a partir do repositório codehaus maven: http://repo1.maven.org/maven2/org/codehaus / mojo / animal-sniffer /
Você precisa de um para verificar uma classe específica ou uma ferramenta genérica para comparar frasco de? Se é para uma classe, simplesmente carregar a classe em um carregador de classe personalizada, verificar a assinatura métodos usando reflexão e é isso. Se você precisar dele para muitos / Classes de JAR isso vai ser muito trabalho.