У меня есть система, состоящая из нескольких веб-приложений (войны) и библиотек (jar). Все они используют maven и находятся под моим контролем (исходный код, встроенные артефакты в Nexus, ...). Скажем, что приложение A использует библиотеку L1 напрямую и L2 косвенно (используется из L1). Я могу легко проверить дерево зависимостей сверху вниз от приложения, используя maven's dependency: tree или graph: plugins проекта. Но как я могу проверить, кто использует мою библиотеку? В моем примере я хочу знать, является ли A единственным приложением (или библиотекой), использующим L1, и что L2 используется из L1 и из какого-либо другого приложения, скажем B. Существует ли какой-либо плагин для maven или nexus или я должен попробовать написать для этого сценарий? Каковы ваши предложения?Кто использует мой артефакт maven?
ответ
Если вы хотите, чтобы достичь этого на уровне хранилища, Apache Archiva имеет «используемый» функции, перечисленные в соответствии с проектной информацией
.
Это похоже на то, что перечисляет mvnrepository.com в разделе «Используется» в описании артефакта.
К сожалению, Nexus похоже не предоставляет эквивалентную функцию.
Теперь я полагаю, что для этого было бы непросто поддерживать еще один репозиторий, но тогда это, вероятно, было бы проще, чем некоторые другие предложения, например, написать плагин для Nexus. Я считаю, что Archiva может быть настроен на прокси-сервер других репозиториев.
Update
На самом деле, есть также plugin for Nexus для достижения «используется» особенность.
Я не думаю, что есть способ Maven сделать это. При этом есть способы сделать это или подобные вещи. Вот несколько примеров:
Откройте свои проекты в своей любимой среде IDE. Например, Eclipse поможет вам провести анализ воздействия на уровне класса, который в большинстве случаев может быть достаточно хорошим.
Используйте простой «
grep
» в исходном каталоге. Это звучит немного brusk (а также о том, очевидное), может быть, но мы использовали это многоИспользование зависимостей инструментов анализа, такие как Sonargraph или Lattix
Насколько я знаю ничто по этим строкам не существует как инструмент с открытым исходным кодом. Вы можете написать плагин Nexus, который пересекает репо и проверяет использование вашего компонента во всех других компонентах, итерируя все помпы и анализируя их. Это было бы довольно тяжелой задачей для запуска, поскольку, поскольку она должна была бы смотреть на все компоненты и анализировать все помпы.
Аналогичным образом вы можете сделать это в локальном репозитории с помощью другого инструмента. Однако, вероятно, имеет смысл анализировать содержимое менеджера репо, а не локального репозитория.
Возможно, более интересно: что бы вы сделали с этой информацией? Сообщите разработчикам A больше не использовать библиотеку L1 или L2, потому что у нее критическая ошибка? На мой взгляд, вы должны иметь возможность создавать черный список зависимостей/родителей/плагинов в вашем менеджере репозитория. Как только проект пытается развернуть/загрузить себя с черным списком артефакта, он должен потерпеть неудачу. Я говорю uploading
, а не downloading
, потому что это может сломать много проектов. Насколько мне известно, это еще не доступно для любого репозитория-менеджера.
Sonatype CLM делает именно это возможным с интеграцией установки Nexus и CLM. Он также имеет интеграцию с Jenkins/Hudson и Eclipse, поэтому вы можете создавать сбои или как разработчик проверять ваши компоненты. –
Я знал о возможностях с расширениями, но не о готовом к использованию решении. Благодарю. –
Я бы использовал эту информацию для рефакторинга и тестирования. Если я исправил ошибку в одной библиотеке, какое приложение нужно протестировать? Если одна библиотека (или метод/класс/пакет из библиотеки) устаревает, какие приложения (и другие библиотеки) должны быть реорганизованы? Да, есть единичные и интеграционные тесты, чтобы поймать самые большие несовместимые изменения, но их не всегда достаточно. – Kojotak
Один из способов решения этой проблемы находится вне самой Java: напишите сценарий мониторинга уровня ОС, который отслеживает каждый случай fopen() в файле jar под вопросом! Предполагая, что это в корпоративной среде, вам, возможно, придется подождать несколько недель (!), Чтобы разрешить всем, использующим процессы, доступ к библиотеке хотя бы один раз!
В Windows, вы можете использовать Sysinternals Process Monitor, чтобы сделать это: http://technet.microsoft.com/en-us/sysinternals/bb896645
В Unix вариантов, вы должны использовать DTrace или Трассирование.
Мне не известны публичные библиотеки для этой работы, поэтому я написал настраиваемое приложение, которое делает это для меня. Я работаю с распределением, которое объединяет более 70 артефактов. Много раз после изменения артефакта я хочу, чтобы изменения были обратно совместимы (т. Е. В зависимых артефактах не возникают ошибки компиляции). Чтобы достичь этого, было важно знать всех зависимых от модифицированного артефакта.
Следовательно, я написал приложение, которое сканирует все артефакты под каталогом (/ подкаталоги), извлекает их pom.xml и ищет (в разделе зависимостей pom) за появление модифицированного артефакта. (Я сделал это в java, хотя скрипт shell/windows может сделать это еще более компактно.)
Я с удовольствием передам код в github, если это может быть любой помощью.
Это была бы отличная идея! – Kojotak
@ Kojotak - Код размещен в git: https://github.com/ShrutiTiwari/artifacto Основной класс: JarInspector. Метод main() находит все артефакты в зависимости от «junit» и «эфира» в библиотеке «apache-maven-3.0.4». Его протестировали на windows (надеюсь, он будет работать на linux as-is). Однако этот подход имеет один недостаток - не захватывает транзитивные зависимости. –
Эй Койотак! вы нашли полезный для этого gitcode (дайте мне знать, если вы застряли во время его использования). Я изменил его, чтобы принимать входы командной строки-arg, например. для проверки maven-distributution-library-артефактов в зависимости от junit, команда будет: java -jar artifacto-1.0.0-SNAPSHOT.jar C: \ software \ installation \ build-tools \ apache-maven-3.0.4 \ lib \t junit –
Один из способов, который может удовлетворить ваши потребности, - создать мастер-помпу со всеми вашими проектами maven. Затем вы выполните следующую команду на master-pom:
mvn dependency:tree -DoutputType=graphml -DoutputFile=dependency.graphml
Открыть сгенерированный файл в yEd.
Пользовались инструкции, приведенные здесь: http://www.summa-tech.com/blog/2011/04/12/a-visual-maven-dependency-tree-view/
Я пробовал master pom, зависящий только от приложений, но поскольку они упакованы как война, переходные зависимости от библиотек (банок) не были включены. Я не могу просто создать один мастер-помп, зависящий от всех проектов (приложений и библиотек), поскольку разные версии одной и той же библиотеки используются разными приложениями и имеют разные зависимости. – Kojotak
Я успешно выполнил команду maven. Но я получаю исключение при попытке открыть outputFile в yed: yEd обнаружил следующую ошибку: Не удалось импортировать файл dependency.graphml. Вызвано: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Содержание не доступно в прологе. \t at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (DOMParser.java:251) –
ИМХО, а также из моего опыта, ищет технического решения такой задачи часто является излишним. Если причина, по которой вы хотите узнать, кто использует ваш артефакт (библиотека), состоит в том, что вы хотите обеспечить обратную совместимость при изменении артефакта или чего-то подобного, я думаю, что это лучше всего сделать, передав ваши изменения с использованием традиционных каналов, а также поощряйте другие команды, которые могут использовать вашу библиотеку, чтобы говорить об этом (блоги проекта, вики, электронная почта, хорошо известное место, где размещаются документы, Jour fixe и т. д.).
Теоретически вы можете написать сценарий, который сканирует каждый проект в вашем репозитории, а затем анализирует maven build.xml (при условии, что все они используют maven) и посмотреть, определили ли они зависимость от вашего артефакта. Если все проекты в вашей организации соответствуют стандартной структуре maven, должно быть легко написать один такой скрипт (хотя, если какой-либо из этих проектов имеет зависимость от вашего артефакта через транзитивную зависимость, все может стать немного более сложным).
- 1. Кто использует мой пакет Go
- 2. кто загрузил артефакт в Nexus?
- 3. Ошибка Maven Отсутствует артефакт
- 4. ошибки зависимостей Maven (артефакт)
- 5. Maven - отсутствует артефакт
- 6. Что такое артефакт Maven?
- 7. Maven 'Отсутствует артефакт
- 8. Missing артефакт Maven
- 9. Как узнать, кто использует мой веб-сервис
- 10. Отслеживайте всех, кто использует мой код
- 11. maven install-file «Отсутствует артефакт»
- 12. Прямая копия Maven как артефакт
- 13. Джерси 2.12 Артефакт Maven Местоположение
- 14. Почему мой Maven не использует определенную спецификацию?
- 15. Maven установить команду развернуть артефакт Maven хранилище
- 16. Хозяин maven артефакт с Cloudbees
- 17. Maven отсутствует артефакт при добавлении powermock
- 18. «Скрыть» артефакт maven из автозаполнения eclipse
- 19. Отсутствует артефакт в проекте Maven?
- 20. Недостающие GitHub Maven плагин артефакт
- 21. Maven: Артефакт еще не упакован
- 22. Maven: Найти где артефакт каталог
- 23. Что содержит артефакт Maven javax.ws.rs.Path?
- 24. Maven профиль и артефакт версия
- 25. Как сообщить maven, что артефакт был переименован?
- 26. Maven отсутствует артефакт com.sun.jndi.ldap. Что не так?
- 27. копия артефакт из репозитория Maven местного
- 28. Кто-нибудь использует GoogleData?
- 29. Почему maven не показывает артефакт линзы?
- 30. Любой, кто использует среду тестирования JRuby для Eclipse/Maven?
Это было бы очень полезно, мне понадобилась эта функциональность много раз :-) Увы, я не верю, что такая вещь может существовать. Может быть, какой-то инструмент, который сканирует проекты в вашем рабочем пространстве, но насколько он может знать, какие проекты, живущие за пределами вашего домена, используют его ... – alterfox