Как определить отсутствующий метод (двоичная совместимость) в JAR статически - PullRequest
18 голосов
/ 11 января 2010

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

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

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

1011 * Е.Г. *

Класс "Зависит от" Foo зависит от Бара (как и многие другие работники среднего класса)

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

Ответы [ 6 ]

16 голосов
/ 10 января 2011

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

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

enter image description here

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

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
3 голосов
/ 02 ноября 2015

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

3 голосов
/ 27 ноября 2014

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

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

3 голосов
/ 10 января 2011

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

java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
2 голосов
/ 11 января 2010

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

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

0 голосов
/ 11 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...