Как перечислять зависимости JAR
есть ли инструмент, который может перечислить сторонние "пакеты", содержащие классы (сторонние), указанные в JAR? Скажем, что он узнает, что такое "домашний" пакет из определения файла JAR, и распечатает список полностью квалифицированных имен сторонних классов до 3-го уровня, на которые ссылались в JAR.
org.apache.commons
org.apache.maven
javax.servlet.jsp
org.eclipse.persistence
org.apache.jackrabbit
целью является то, что мне нужно найти зависимости maven для этого JAR файла и развернуть его как артефакт maven.
Ответы
Ответ 1
JarAnalyzer:
утилита управления зависимостями для файлов jar. Основная цель состоит в том, чтобы пройти через каталог, проанализировать каждый из файлов jar в этом каталоге и определить зависимости между файлами jar. Вывод представляет собой XML файл, представляющий PhysicalDependencies между файлами jar.
Для получения дополнительной информации о PhysicalDependencies, включая различные шаблоны проектирования, проверьте Расширяемая Java...
Ответ 2
С JDK 8 появился новый инструмент: jdeps
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
jdeps - это новый инструмент командной строки, добавленный после JDK 8 для разработчиков, чтобы понимать статические зависимости своих приложений и библиотек. jdeps - это инструмент статического анализа файлов заданных классов.
Ответ 3
Вы можете сделать следующее (если это проект maven):
mvn dependency:tree
Он также показывает транзитивные зависимости, что делает его очень полезным для отладки конфликтов зависимостей.
Ответ 4
Если вы используете maven (как я понял), вы можете просто использовать плагин Maven Dependency.
Сначала вам нужно написать базовый pom.xml со всеми вашими баночками, вы можете скопировать этот пример (я использую hibernate в качестве примера) и заменить ваши банки:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.5.0-Final</version>
</dependency>
<!-- add here other dependencies -->
</dependencies>
</project>
затем откройте терминал, перейдите в содержащую папку pom.xml выше и запустите эту команду:
mvn зависимость: дерево
это напечатает список зависимостей...
или если вы хотите загрузить и скопировать в папку все зависимости, выполните следующую команду:
mvn зависимость: копии-зависимости
вы найдете все свои зависимости в папке./target/dependencies
Ответ 5
Tattleltale - это инструмент от JBoss, который делает это
tattletale.jboss.org/
Ответ 6
Моя первая мысль заключалась в том, что вы могли бы сделать это, используя загрузчик классов, чтобы перебирать все файлы классов в банке и использовать отражение для анализа каждого из них для их зависимостей. Однако класс Class не имеет метода, который сообщает вам эту информацию. Поэтому следующей мыслью было бы использовать какой-то анализатор байт-кода (asm, например), чтобы вытащить все ссылочные классы из класса компиляции,
Предполагая, что вы можете получить эту информацию, следующая проблема будет заключаться в обратном отслеживании классов в jars. В некотором смысле это было бы легкой частью, потому что все, что вам нужно было бы сделать, это создать загрузчик классов для каждой банки в вашем maven-репо, или в каталоге, или где бы ни были банки, а затем спросить каждого по очереди, если он содержит определенный класс.
Недостаток в этом мышлении состоит в том, что класс java (исходный или скомпилированный) не детализирует, откуда взять импортированный класс. Поэтому, если у вас есть два класса с одним и тем же пакетом и именем (чаще, чем вы думаете), то вы не сможете сказать, что использовать.
Даже java просто предполагает, что первый, который он находит в пути к классу, является правильным и генерирует исключение, если оно оказывается неправильным (MethodNotFoundException). Поэтому, если вы еще не собираетесь проанализировать байт-код, чтобы выяснить, какие методы на каждом классе вызываются, а затем сравнивать их с классами в вашем пути к классу, вы все равно не сможете быть верными.
Вкратце, возможно, возможно сделать то, что вы хотите, но, вероятно, будет очень сложным и трудоемким.
Как я обычно справляюсь с этим, нужно просто запустить класс в тестовом коде и продолжать добавлять зависимости, пока я не получу его для выполнения каждого метода, который меня интересует.
Ответ 7
Если ваш проект основан на maven
mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath
Посмотрите ссылку ниже
http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html
Может быть в вашем случае
mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath -f pathtopom.xml of third party
Ответ 8
Это может быть альтернативой этому инструменту. Но он не перечисляет ссылочные классы. Последний номер определяет "уровень пакета".
jar tvf yourjar.jar | perl -nle'BEGIN{$depth=(shift)-1}print join(".", (split(/\//, (split)[-1]))[0..$depth])' 3
Проблема заключается в том, что таким образом невозможно получить ссылочные классы из определений классов. Таким образом, единственный способ, возможно, сделать это в JAVA.
Итак, вопрос: есть ли какой-нибудь инструмент Java, который может это сделать?
EDIT:
Я нашел то, что мне нужно: M2eclipse имеет функцию под названием Поиск по классам
В представлении maven repositories щелкните правой кнопкой мыши репозиторий и включите полный индекс
Затем Navigate > Open type from maven - там вы можете просмотреть все доступные артефакты, основанные на стандарте java package