Подтвердить что ты не робот

Как идентифицировать отсутствующий метод (двоичная совместимость) в JAR статически

Я хочу проверить двоичную совместимость между двумя JAR.

Следуя рекомендациям в этом ответе, я использовал jboss tattletale, но он может найти только отсутствующие классы.

Как я могу найти, если отсутствуют методы? Возможно ли вообще?

например.

"Depends - on" class Foo зависит от Bar (как и многие другие работники среднего класса)

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
    }
}

Класс времени компиляции

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);
    }

}

Теперь представьте себе, что старая панель бара заменяет скомпилированную шкалу времени:

Класс времени выполнения

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);
    }
}

Есть ли способ идентифицировать отсутствующий метод без его запуска и получения NoSuchMethodError?


Отказ от ответственности. Это серьезная перефразировка моего собственного связанного вопроса, который неуязвим. Я выбрал задание нового вопроса, потому что перефразировка сделает текущие 2 ответа как совершенно не связанные с темой.

4b9b3361

Ответ 1

japi-compliance-checker - обратная проверка совместимости API/ABI для библиотеки Java:

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

введите описание изображения здесь

sigtest - Инструмент проверки подписей Oracle SigTest и API-интерфейс

japitools - проверка совместимости между API Java

japi-checker - проверка обратной совместимости Java API, работающая на двоичном уровне

revapi - API-анализ и инструмент отслеживания изменений

или вручную с помощью декомпилятора javap:

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

Ответ 2

Clirr - проверяет библиотеки Java на двоичную и исходную совместимость со старыми версиями:

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

Ответ 3

Revapi также может выполнять эту работу. Легко включить его в сборки maven, что, разумеется, не ваше дело, но может представлять интерес для других.

Он также может проверять произвольные множества банок, используя автономный режим.

Ответ 4

japicmp - еще один инструмент для проверки совместимости двоичных файлов. Он доступен как автономный инструмент командной строки или как плагин maven.

Ответ 5

Существует инструмент под названием Animal Sniffer, который позволяет извлекать подпись для API. Затем он может статически проверить, что пользователи API придерживаются подписи, и он может статически проверить, что разработчики API все реализовали. Я думаю, что это решит вашу проблему хорошо.

Вы можете скачать банку для Animal Sniffer из репозитория Codehaus Maven: http://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer/

Ответ 6

Вам нужен а, чтобы проверить определенный класс или общий инструмент для сравнения jar's? Если это для 1 класса, просто загрузите класс в пользовательский загрузчик классов, проверьте подписи методов, используя отражение и это. Если вам это нужно для многих JAR/Classes, это будет слишком много работы.