Ошибка NoSuchMethod при попытке использовать файл JAR более поздней версии - PullRequest
0 голосов
/ 12 января 2012

В программе я использую две внешние библиотеки jar. Во внешней библиотеке X есть класс, вызывающий метод m класса в библиотеке Y. Библиотека X была скомпилирована с версией 1.0 библиотеки Y. Однако, поскольку я использую библиотеку Y для других целей в своем коде, я предпочел использовать ее последнюю версию (скажем, 5.0). Моя проблема в том, что когда я выполняю код, библиотека X жалуется, что метод m больше не существует (выдает ошибку NoSuchMethod). Тем не менее, метод есть.

Проблема может быть связана с тем, что я использую более новую версию библиотеки Y, чем та, которая присутствовала во время компиляции? (хотя и обратно совместимый, с другим байт-кодом?). Если это так, то я буду немного озадачен, так как думал, что вызовы java-методов выражаются в байт-коде в виде символических ссылок (например, сигнатур методов), а не в виде прямых ссылок (например, смещений), но я мог бы неправильно понять что-то.

Спасибо за любые разъяснения!

Ответы [ 2 ]

3 голосов
/ 12 января 2012

[...] Я думал, что вызовы java-методов были выражены в байт-коде как символические ссылки (например, сигнатуры методов), а не как прямые ссылки (например, смещения) [...]

Вы правильно подумали; но возможно, что метод в Y v5.0 имеет сигнатуру, отличную от метода в Y v1.0, даже если они имеют одно и то же имя; например, у него может быть другое количество аргументов, или другие типы аргументов, или он может стать static или не- static.

1 голос
/ 12 января 2012

Метод name , который вызывает X, может все еще существовать в jar Y, но, возможно, метод signature изменился - то есть число или типы аргументы могли измениться.

...