Вопрос или проблема
Существует ли инструмент, который, имея набор jar-файлов (и/или класс-файлов, возможно, плюс java-исходники), сообщает, когда какие-либо зависимости Java байткода не выполняются (например, отсутствуют типы, методы, конструкторы и/или поля)?
Очевидно, что компилятор делает это для исходного кода, но мне это нужно для байткода.
jdeps
, похоже, работает только для классов и/или пакетов, а не для членов классов.
Мне нужен этот инструмент, чтобы убедиться, что мои jar-файлы по крайней мере бинарно совместимы с несколькими версиями сторонних jar-файлов. Я компилирую только против самых новых поддерживаемых версий jar, но если более старая версия jar не бинарно совместима, тогда я знаю, что она не может работать для всех путей выполнения в моем коде. Очевидно, что бинарная совместимость не гарантирует правильность, но, по крайней мере, она выявляет определенные несовместимости.
Возможно, это не совсем то, что вам нужно, но обратите внимание на bnd.
Он проводит глубокую инспекцию байткода для генерации метаданных для модульных (OSGi) jar-файлов, что может быть вам полезно. Например, его Базовое выравнивание звучит несколько похоже на то, что вы описываете. Возможно, вы можете расширить его или использовать его в качестве основы для решения вашей задачи.
Ответ или решение
Для решения задачи проверки удовлетворения всех байт-кодовых зависимостей в Java, в частности обнаружения отсутствующих типов, методов, конструкторов и полей в предоставленных JAR-архивах или класс-файлах, несколько полезных инструментов могут быть рассмотрены. Несмотря на то, что компиляторы подходят для исходного кода, вы нуждаетесь в аналогичном инструменте для байт-кода.
Первым инструментом, который приходит на ум, является jdeps
. Однако, как вы заметили, jdeps
в основном выполняет анализ зависимостей на уровне классов и пакетов, а не на уровне конкретных членов классов (методов, конструкторов и полей). В этом отношении он может быть ограниченным для ваших нужд.
Альтернативные Инструменты
-
Bndtools: Это инструмент с глубоким анализом байт-кода, преимущественно используемый для создания метаданных для модульных JAR-архивов OSGi. Концепция базирования (Baselining), охватываемая Bndtools, может оказаться полезной. Она позволяет определить изменения между двумя версиями артефактов, включая возможные нарушения бинарной совместимости. С Bnd вы можете попытаться расширить функциональность для удовлетворения ваших специфических потребностей.
-
Classycle: Это инструмент для статического анализа, который помогает выявлять зависимости между классами. Вы можете использовать его для выявления циклических зависимостей и их анализа, что может косвенно выявлять некоторые проблемы совместимости.
-
Revapi: Это инструмент, предназначенный для сравнения API и может быть использован для определения несовместимостей между различными версиями библиотек. Хотя это больше ориентирован на API, с его помощью можно также выявить изменения в байт-коде.
-
ASM или BCEL: Библиотеки низкого уровня для анализа и манипулирования байт-кодом Java. Хотя из коробки эти библиотеки не предоставляют всей функциональности, требуемой для вашей задачи, они могут быть использованы для создания пользовательских решений.
Заключение
Для полноценного решения задачи, исходя из вашего описания, может потребоваться разработка специализированного инструмента на основе существующих решений, таких как Bnd или использование библиотек ASM/BCEL для создания специализированных сценариев анализа байт-кода. Базирование на существующих инструментах с открытым исходным кодом может значительно ускорить процесс разработки, предоставив необходимые уровни анализа и параметризации.
Если вашей целью является SEO-оптимизация, не стоит забывать включать в контент ключевые слова и фразы, такие как "анализ Java байт-кода", "инструмент для проверки зависимостей JAR", и "инструменты статического анализа Java".
Подходя к задаче с профессиональной точки зрения, важно учитывать всю экосистему существующих инструментов и возможности их расширения, чтобы наилучшим образом удовлетворить ваши уникальные требования к проверке бинарной совместимости в Java.