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

Я хочу проверить бинарную совместимость между двумя JAR-файлами.

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

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

E.g.

Класс «зависит от» Фу зависит от Бара (как и многие другие работники среднего класса)

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

}

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

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

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 ответа совершенно не связанными с темой.


person Eran Medan    schedule 11.01.2010    source источник
comment
вы можете прокомментировать другой вопрос, что он должен быть закрыт, и суперпользователи могут закрыть его для вас   -  person Yoni    schedule 11.01.2010
comment
@Yoni - уже сделал это   -  person Eran Medan    schedule 11.01.2010
comment
без запуска == статически (в заголовке вопроса)   -  person linuxbuild    schedule 19.01.2011
comment
@developer Вы просите отредактировать вопрос? без бега это кажется мне достаточно ясным.   -  person Michael Donohue    schedule 19.01.2011
comment
@Michael - нет, я просто хочу обратить внимание автора вопроса и читателей на популярный синоним этого термина для более эффективного гугления в будущем.   -  person linuxbuild    schedule 19.01.2011
comment
@aponomarenko - спасибо, готово.   -  person Eran Medan    schedule 01.02.2012


Ответы (6)


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

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

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

sigtest — инструмент Oracle для тестирования подписи SigTest и проверки соответствия API.

japitools — тест на совместимость между Java API

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
person linuxbuild    schedule 10.01.2011
comment
Привет! ребята, могу ли я иметь один небольшой пример для этого. т. е. в каком основании он сравнивается. как я могу получить все детали отладки на экране? - person Piyush; 13.06.2012
comment
@picnic4u — используйте дополнительную опцию --debug инструмента japi-compliance-checker для создания промежуточного вывода javap в подкаталог debug/. - person linuxbuild; 15.06.2012
comment
Большое спасибо, теперь я получаю все подробности с версией 1.1.2. - person Piyush; 15.06.2012

Clirr – проверяет библиотеки Java на совместимость двоичных файлов и исходного кода со старыми версиями:

java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
person linuxbuild    schedule 10.01.2011
comment
Спасибо, а почему, кстати, два разных ответа? - person Eran Medan; 01.02.2012
comment
@EranMedan Хм, не помню причину =) - person linuxbuild; 01.02.2012

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

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

person metlos    schedule 26.11.2014
comment
У проекта нет загружаемых файлов - или я не смог найти ссылку на их основном веб-сайте. - person Jayan; 19.01.2016
comment
Раздел загрузки теперь есть на обновленном сайте: revapi.org/downloads.html - person metlos; 25.02.2016

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

person siom    schedule 02.11.2015
comment
Не забудьте указать свою принадлежность к проектам или блогам, которые вы упоминаете в своих сообщениях. Добавьте соответствующее раскрытие во все три таких ответов. Кроме того, если вы рекомендуете инструмент или библиотеку, вы должны показать, как их можно применять. - person Artjom B.; 02.11.2015

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

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

person Michael Donohue    schedule 11.01.2010
comment
@Michael, ты нашел ссылку для скачивания? где прячется? - person Eran Medan; 11.01.2010
comment
Инструмент написан людьми из Maven, поэтому я думаю, что они просто используют различные репозитории maven, что легко в Maven. К сожалению, в «муравье» не все так просто. - person Michael Donohue; 11.01.2010
comment
Я еще не тестировал его, но пока это лучший ответ, я добавлю комментарий, как только попробую. - person Eran Medan; 14.01.2010

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

person Shlomo Schwarcz    schedule 11.01.2010