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

StackOverflow https://stackoverflow.com/questions/2040693

Вопрос

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

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

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

Например.

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

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

}

Теперь представьте себе старый Bar 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?


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

Это было полезно?

Решение

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

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

enter image description here

сигнализация - Инструмент Oracle для тестирования сигнатур SigTest и соответствия API.

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

Джапи-шашка - средство проверки обратной совместимости Java API, работающее на двоичном уровне.

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

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

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

Другие советы

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

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

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

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

ЯПИКМП — еще один инструмент для проверки бинарной совместимости.Он доступен как отдельный инструмент командной строки или как плагин maven.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top