Как составить список зависимостей JAR - PullRequest
48 голосов
/ 11 декабря 2010

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

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

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

Ответы [ 8 ]

26 голосов
/ 16 декабря 2010

JarAnalyzer :

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

Для получения дополнительной информации о PhysicalDependencies ,включая различные шаблоны проектирования, ознакомьтесь с Расширяемая Java ...

23 голосов
/ 18 сентября 2017

С JDK 8 появился новый инструмент: jdeps

https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool

jdeps - это новый инструмент командной строки, добавленный начиная с JDK 8 для разработчиковпонимать статические зависимости своих приложений и библиотек.jdeps - это инструмент статического анализа файлов заданных классов

10 голосов
/ 23 февраля 2016

Вы можете сделать следующее (если это проект Maven):

mvn dependency:tree

Также показаны транзитивные зависимости, что делает его очень полезным для отладки конфликтов зависимостей.

3 голосов
/ 19 января 2015

Tattleltale - это инструмент от JBoss, который делает это

tattletale.jboss.org /

3 голосов
/ 07 января 2014

Если вы используете Maven (как я понял), вы можете просто использовать плагин Maven Dependency.

Сначала вам нужно написать базовый pom.xml со всеми вашими jar-файлами, вы можете скопировать этот пример (в качестве примера я использую hibernate) и заменить ваши jar-файлы:

    <?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

2 голосов
/ 16 декабря 2010

Моей первой мыслью было, что вы можете сделать это, используя загрузчик классов, чтобы перебрать все файлы классов в банке и использовать отражение, чтобы проанализировать каждый из них на предмет их зависимостей.Однако класс Class не имеет метода, который сообщает вам эту информацию.Поэтому следующая мысль будет заключаться в том, чтобы использовать какой-то анализатор байт-кода (например, asm ), чтобы извлечь все ссылочные классы из класса компиляции.

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

Недостаток этого мышления заключается в том, что класс Java (исходный код или скомпилированный) не детализирует, откуда взять импортированный класс.Поэтому, если у вас есть два класса с одинаковым пакетом и именем (это происходит чаще, чем вы думаете), то вы не сможете определить, какой из них использовать.

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

INКороче говоря, возможно, можно делать то, что вы хотите, но, вероятно, это будет очень сложно и отнимает много времени.

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

1 голос
/ 11 декабря 2010

Если ваш проект основан на 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 
0 голосов
/ 11 декабря 2010

Это может быть альтернативой этому инструменту. Но он не перечисляет ссылочные классы. Последний номер определяет «уровень пакета».

jar tvf yourjar.jar | perl -nle'BEGIN{$depth=(shift)-1}print join(".", (split(/\//, (split)[-1]))[0..$depth])' 3

Проблема в том, что таким образом невозможно извлечь ссылочные классы из определений классов. Так что единственный возможный способ - это сделать это в JAVA.

Итак, вопрос: есть ли какой-нибудь инструмент Java, который может это сделать?

EDIT:

Я нашел то, что мне было нужно: в M2eclipse есть функция под названием Поиск по классу

В представлении хранилищ maven щелкните правой кнопкой мыши хранилище и включите полный индекс

Затем перейдите> Открыть тип из maven - там вы можете просмотреть все доступные артефакты в соответствии с соглашением о пакете Java

...