Инструмент для обнаружения нарушенных зависимостей JAR на уровне сигнатур класса и метода - PullRequest
2 голосов
/ 21 февраля 2011

Сценарий проблемы следующий (Примечание: это не проблема зависимости между банками, поэтому такие инструменты, как JarAnalyzer, ClassDep или Tattletale не помогут. Спасибо).

У меня большой проект, которыйсоставлен в 10 или более артефактов банку.Все банки зависят друг от друга и образуют иерархию зависимостей.

Всякий раз, когда мне нужно изменить один из файлов, я бы проверял соответствующий исходный код и исходный код для проектов, которые зависят от него.Измените код, скомпилируйте, упакуйте файлы.Пока все хорошо.

Проблема в том, что я могу забыть проверить один из зависимых проектов, потому что зависимости между банками могут быть довольно длинными и со временем меняться.Если это произойдет, некоторые jar-файлы могут перестать синхронизироваться, и я в конечном итоге получу NoSuchMethodException или какую-то другую проблему несовместимости классов во время выполнения, чего я хочу избежать.

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

Однако у меня есть все банки, так чтогипотетически должна быть возможность проверить, что jar-файлы, которые зависят от измененного кода, имеют несоответствие в сигнатуре метода, именах классов и т. д. Но как я могу выполнить такую ​​проверку?

Кто-нибудь сталкивался с подобной проблемой раньше?Если да, то как ты решил это?Буду признателен за любые инструменты или методологии.

Дайте мне знать, если вам нужны разъяснения.Спасибо.

РЕДАКТИРОВАТЬ :

Я хотел бы немного прояснить свой вопрос.

Конечная цель этой задачи состоит в том, чтобы проверить, чтовнесенные мною изменения будут скомпилированы для всего проекта.Я ищу инструмент / технику, которая помогла бы мне выполнить такую ​​проверку.

Рассмотрим этот пример:

У вас есть 2 проекта: A и B, которые развернуты как A.jar и B.баночка соответственно.A зависит от B.

Вы хотите изменить B, поэтому вы проверяете его и изменяете сигнатуру метода, от которой зависит A.Вы можете скомпилировать B и выполнить все тесты самостоятельно без каких-либо проблем, потому что сам B не зависит ни от чего.Таким образом, вы с радостью фиксируете свои изменения.

Через несколько часов полная интеграция проекта не удалась, потому что A не удалось скомпилировать!

Как мне избежать этого?

Видинструмент, который я ищу, извлечет A.jar и проверит, что все зависимости в A от нового модифицированного B все еще в порядке.Как потенциальная ошибка компиляции, которая произошла бы, если бы я перекомпилировал источники A и B.

Другое решение, как предлагалось многими из вас, - это установить локальную непрерывную интеграциюсистема, которая будет перекомпилировать весь проект локально.Я не возражаю против этого, но я хочу избежать этого внутри своего рабочего пространства.С другой стороны, если я извлекаю все источники в другое временное рабочее пространство, мне нужно отразить локальные изменения во временном рабочем пространстве.

Это довольно большая проблема в моей команде, поскольку сборки очень часто ломаются, потому что кто-то забывает проверить (или открыть в Eclipse) правильный набор проектов.Я пытался убедить людей проверить исходный код и перекомпилировать связку перед фиксацией, но это не только требует времени, но и требует выполнения нескольких команд, поэтому большинству людей это просто кажется слишком хлопотным.Если техника не проста или автоматизирована, то она непригодна для использования.

Ответы [ 6 ]

2 голосов
/ 24 февраля 2011

Проверка подписей к сожалению недостаточно . Наличие правильных подписей не означает, что это будет работать. Это все о контрактах , а не только подписи. Я имею в виду, что произойдет, если новая версия библиотеки будет иметь ту же сигнатуру метода, но теперь она принимает параметр ArrayList в обратном порядке? Вы столкнетесь с проблемами - рано или поздно. Я думаю, вы, возможно, подумаете о реализации таких инструментов, как Ivy или Maven:

http://ant.apache.org/ivy/

http://maven.apache.org/

Да, это может быть сложно реализовать, но как только оно у вас будет, оно будет "охранять" ваши версии навсегда. Вы никогда не должны сталкиваться с такой проблемой. Но даже эти инструменты сборки не на 100% точны. Единственный правильный способ работы с несовместимыми библиотеками, я знаю, вам не понравится мой ответ, это расширенное регрессионное тестирование . Для этого вам понадобится куча инструментов тестирования. Их много: от базового модульного тестирования (JUnit) до тестирования базы данных (JDBC Proxy) и сред тестирования UI, таких как SWTBot (зависит от того, является ли ваше приложение веб-приложением или толстым клиентом).

Обратите внимание, если ваш проект становится действительно огромным, и у вас есть большое количество зависимостей, вы всегда не используете весь код там. Попытка проверить все интерфейсы и все подписи - это слишком много. Нет необходимости проверять все это, когда ваш код использует, скажем, 30% кода библиотеки. Что вам нужно, это проверить, что вы действительно используете. И это может быть сделано только с помощью обширного регрессионного тестирования.

2 голосов
/ 21 февраля 2011

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

Я знаю Дженкинс - его легко установить (просто запустить) на локальном компьютере, и я бы посоветовал запустить его локально, если в ИТ-инфраструктуре, которая соответствует вашим потребностям, нет никого.

1 голос
/ 27 февраля 2011

Я наконец нашел целую шкатулку с ответами в этом посте .Спасибо всем за помощь!

Награда вручается К. Клазену за самый быстрый и самый полезный материал.

1 голос
/ 24 февраля 2011

Я также думаю, что установка локальной Jenkins - лучшая идея.Какой инструмент вы используете для сборки?Может быть, вы можете улучшить свою ситуацию, перейдя на Maven в качестве инструмента для сборки?В более умных и не перекомпилируйте полный проект, если вы не спросите об этом напрямую.Но переключиться на IN можно ОГРОМНОЙ краской на шее - это вряд ли зависит от того, как вы организовали проект сейчас ...

А насчет VCS - существует мост Mercurial / SVN - так что вы можете использовать локальный Mercurial для своей разработки.... проверьте эту ссылку: https://www.mercurial -scm.org / wiki / WorkingWithSubversion

0 голосов
/ 24 февраля 2011

Я использую IntelliJ, а не Eclipse, поэтому, возможно, мой ответ слишком специфичен для IDE. Но в IntelliJ я бы просто включил модули из B в A, чтобы при внесении изменений в A он сразу ломался при компиляции в IDE. Модули могут принадлежать нескольким проектам, так что это не просто дублирование, это просто добавление ссылок в IDE к модулям в других проектах.

0 голосов
/ 23 февраля 2011

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

...