Как идентифицировать отсутствующий метод (двоичная совместимость) в 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 ответа как совершенно не связанные с темой.
Ответы
Ответ 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, это будет слишком много работы.