Comment lister les dépendances d’un JAR

Existe-t-il un outil permettant de répertorier des “packages” tiers contenant des classes (tierces) référencées dans le JAR? Supposons qu’il reconnaîtrait le package “home” de la définition du fichier JAR et qu’il afficherait une liste de noms complets de classes tierces jusqu’au 3ème niveau référencés dans le JAR.

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

le but est que je doive trouver des dépendances Maven pour ce fichier JAR et le déployer comme un artefact Maven.

JarAnalyzer :

un utilitaire de gestion des dépendances pour les fichiers jar. L’objective principal est de parcourir un répertoire, d’parsingr 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 dépendances physiques entre les fichiers jar.

Pour plus d’informations sur les dépendances physiques , y compris une variété de modèles de conception, consultez Extensible Java

Il y a 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 le JDK 8 pour permettre aux développeurs de comprendre les dépendances statiques de leurs applications et bibliothèques. jdeps est un outil d’parsing statique sur les fichiers de classe donnés

Vous pouvez faire ce qui suit (si c’est un projet Maven):

 mvn dependency:tree 

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

Si vous utilisez maven (si j’ai bien compris), vous pouvez simplement utiliser le plug-in Maven Dependency.

Tout d’abord, vous devez écrire un fichier pom.xml de base avec tous vos fichiers JAR, vous pouvez copier cet exemple (j’utilise Hibernate comme exemple) et remplacer vos fichiers JAR:

    4.0.0 com.mycompany.app my-app 1.0-SNAPSHOT jar Maven Quick Start Archetype http://maven.apache.org   org.hibernate hibernate-core 3.5.0-Final     

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

dépendance mvn: tree

cela va imprimer une liste de dépendances …

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

dépendance mvn: dépendances de copie

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

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 du fichier JAR et utiliser la reflection pour parsingr chacun des fichiers de leurs dépendances. Cependant, la classe Class n’a pas de méthode qui vous indique ces informations. La pensée suivante consisterait donc à utiliser un parsingur de type bytecode ( asm par exemple) pour extraire toutes les classes référencées d’une classe de compilation.

En supposant que vous pourriez obtenir cette information, le prochain problème serait de retracer les classes en jars. Dans un sens, ce serait la partie la plus facile car il vous suffit de créer un classloader pour chaque fichier jar dans votre répertoire ou répertoire maven ou quel que soit l’endroit où se trouvent les fichiers jar, puis de demander à chacun s’il contient la classe spécifique.

Le défaut de cette reflection est qu’une classe java (source brute ou compilée) ne détaille pas d’où obtenir la classe imscope. Donc, si vous avez deux classes avec le même package et le même nom (ce qui se produit plus souvent que vous ne le pensez), vous ne pourrez pas dire lequel utiliser.

Même Java suppose que le premier trouvé dans le chemin de classe est le bon et jette une exception s’il s’avère incorrect (MethodNotFoundException). Donc, à moins d’parsingr le bytecode pour déterminer quelles méthodes sur chaque classe sont appelées, puis comparer celles-ci 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 est simplement de lancer la classe dans le code de test et de continuer à append des dépendances jusqu’à ce que je puisse l’exécuter toutes les méthodes qui m’intéressent.

Tattleltale est un outil de JBoss qui le fait

tattletale.jboss.org/

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 

Cela pourrait être une alternative à cet outil. Mais il ne répertorie pas les classes référencées. Le dernier numéro 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’obtenir des classes référencées en dehors des définitions de classe. Donc, le seul moyen possible semble être de le faire en JAVA.

La question est donc la suivante: existe-t-il un outil Java capable de 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, naviguez> Ouvrir le type à partir de Maven – vous pouvez y parcourir tous les artefacts disponibles en fonction de la convention du package Java