Подтвердить что ты не робот

Как перечислять зависимости JAR

есть ли инструмент, который может перечислить сторонние "пакеты", содержащие классы (сторонние), указанные в JAR? Скажем, что он узнает, что такое "домашний" пакет из определения файла JAR, и распечатает список полностью квалифицированных имен сторонних классов до 3-го уровня, на которые ссылались в JAR.

org.apache.commons  
org.apache.maven
javax.servlet.jsp
org.eclipse.persistence
org.apache.jackrabbit

целью является то, что мне нужно найти зависимости maven для этого JAR файла и развернуть его как артефакт maven.

4b9b3361

Ответ 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