web-dev-qa-db-fra.com

Comment lister les dépendances d'un JAR

existe-t-il un outil qui peut répertorier les "packages" tiers qui contiennent des classes (tierces) référencées dans le JAR? Disons qu'il reconnaîtrait le package "home" de la définition du fichier JAR et qu'il imprimerait une liste de noms complets de classes tierces jusqu'au niveau 3 référencées dans le JAR.

org.Apache.commons  
org.Apache.maven
javax.servlet.jsp
org.Eclipse.persistence
org.Apache.jackrabbit

le but est que je dois trouver les dépendances maven pour ce fichier JAR et le déployer comme un artefact maven.

49
lisak

JarAnalyzer :

un utilitaire de gestion des dépendances pour les fichiers jar. Son objectif principal est de parcourir un répertoire, d'analyser chacun des fichiers jar de ce répertoire et d'identifier les dépendances entre les fichiers jar. La sortie est un fichier xml représentant les PhysicalDependencies entre les fichiers jar.

Pour plus d'informations sur PhysicalDependencies, y compris une variété de modèles de conception, consultez - Java extensible ...

25
MJB

Il existe un nouvel outil depuis JDK 8: jdeps

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

jdeps est un nouvel outil de ligne de commande ajouté depuis JDK 8 pour que les développeurs puissent utiliser pour comprendre les dépendances statiques de leurs applications et bibliothèques. jdeps est un outil d'analyse statique sur les fichiers de classe donnés

23
Barry Kelly

Vous pouvez faire ce qui suit (si c'est un projet maven):

mvn dependency:tree

Il montre également les dépendances transitives, ce qui le rend très utile pour déboguer les conflits de dépendance.

10
karthik manchala

Si vous utilisez maven (si j'ai bien compris), vous pouvez simplement utiliser le plugin Maven Dependency.

Vous devez d'abord écrire un pom.xml de base avec tous vos pots, vous pouvez copier cet exemple (j'utilise hibernate comme exemple), et remplacer vos pots:

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

puis ouvrez le terminal, allez dans le dossier contenant le pom.xml ci-dessus et exécutez cette commande:

dépendance mvn: arbre

cela affichera une liste de dépendances ...

ou si vous souhaitez télécharger et copier dans un dossier toutes les dépendances exécutez la commande suivante:

dépendance mvn: dépendances de copie

vous trouverez toutes vos dépendances dans le dossier ./target/dependencies

3
obe6

Tattleltale est un outil de JBoss qui fait cela

tattletale.jboss.org/

3
user2492456

Ma première pensée a été que vous pouviez le faire en utilisant un chargeur de classe pour parcourir tous les fichiers de classe dans le bocal et utiliser la réflexion pour analyser chacun pour leurs dépendances. Cependant, la classe Class n'a pas de méthode qui vous indique ces informations. Donc, la prochaine pensée serait d'utiliser une sorte d'analyseur de bytecode ( asm par exemple) pour extraire toutes les classes référencées d'une classe de compilation.

En supposant que vous puissiez obtenir ces informations, le prochain problème serait de retracer les classes dans des bocaux. Dans un sens, ce serait la partie la plus facile car tout ce que vous auriez à faire serait de créer un chargeur de classe pour chaque bocal dans votre référentiel maven, ou dans le répertoire ou où se trouvent les bocaux, puis de demander à chacun à son tour s'il contenait la classe spécifique.

L'inconvénient de cette réflexion est qu'une classe Java (source brute ou compilée) ne détaille pas d'où obtenir la classe importée. Donc, si vous avez deux classes avec le même package et le même nom (arrive plus souvent que vous ne le pensez), vous ne pourrez pas dire lequel utiliser.

Même Java suppose simplement que le premier qu'il trouve dans le chemin de classe est le bon et lève une exception s'il s'avère incorrect (MethodNotFoundException). Donc, sauf si vous allez analyser plus en détail le bytecode pour comprendre quelles méthodes sur chaque classe sont appelées et ensuite les comparer avec les classes de votre chemin de classe, vous ne pourrez toujours pas être correct.

Bref, il est probablement possible de faire ce que vous voulez, mais cela risque d'être très difficile et long.

La façon dont je traite normalement cela est simplement de lancer la classe dans le code de test et de continuer à ajouter des dépendances jusqu'à ce que je puisse l'exécuter pour chaque méthode qui m'intéresse.

2
drekka

Si le vôtre est un projet basé sur Maven

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath

Regardez le lien ci-dessous http://maven.Apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

Peut être dans votre cas

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath -f pathtopom.xml of third party 
1
srinannapa

Cela pourrait être une alternative pour cet outil. Mais il ne répertorie pas les classes référencées. Le dernier chiffre détermine le "niveau du package".

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

Le problème est que, de cette façon, il est impossible d'extraire des classes référencées des définitions de classe. Donc, la seule façon possible semble être de le faire en Java.

La question est donc: Y a-t-il un outil Java qui peut le faire?

MODIFIER:

J'ai trouvé ce dont j'avais besoin: M2Eclipse a une fonctionnalité appelée Recherche de classe

Dans la vue des référentiels maven, cliquez avec le bouton droit sur un référentiel et activez l'index complet

Ensuite, accédez à> Ouvrir le type à partir de maven - vous pouvez y parcourir tous les artefacts disponibles en fonction de Java

0
lisak