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.

Foi útil?

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

 enter descrição da imagem aqui

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top