2010-12-11 90 views
33

Existe-t-il un outil permettant de répertorier les "packages" tiers qui contiennent des classes (tierces) référencées dans le JAR? Disons qu'il reconnaîtrait ce qui est "home" à partir de la définition de fichier JAR et qu'il afficherait une liste de noms complets de classes tierces jusqu'au niveau 3 qui ont été référencées dans le JAR.Comment lister les dépendances d'un JAR?

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

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

+2

Maven n'est-il pas supposé être exactement dans ce but? – BalusC

+0

Imaginez que vous ayez un projet basé sur Ant et que vous souhaitiez le déployer dans le référentiel maven pour que quelqu'un d'autre l'utilise en tant que dépendance. Vous devez spécifier ses dépendances transitives dans la définition de pom. J'ai besoin d'un moyen qui faciliterait les trouver – lisak

+0

Modifier: Je sais comment le faire manuellement, en dépensant beaucoup d'efforts. La résolution automatisée des dépendances devrait être théoriquement possible, toutes les informations sont déjà dans le .jar et dans le dépôt Maven. –

Répondre

25

JarAnalyzer:

un utilitaire de gestion des dépendances pour les fichiers jar. Son but 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 le PhysicalDependencies entre les fichiers jar.

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

+0

Chrome m'avertit que le site contient des logiciels malveillants. –

+2

Ne me prévient pas Paul. – MJB

+0

Hmm, oui, il semble avoir disparu. Désolé pour le bruit. –

0

Cela peut constituer une alternative pour cet outil. Mais il ne répertorie pas les classes référencées. Le dernier numéro détermine "niveau de paquet".

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

Le problème est que cette façon, il est impossible d'obtenir les classes référencées sur les définitions de classe. Donc, la seule façon possible semble être de le faire en JAVA. Donc, la question est: Y at-il un outil Java qui peut le faire?

EDIT:

J'ai trouvé ce que je besoin: m2eclipse a une fonction appelée recherche de classe

Dans le maven voir référentiels, clic droit un référentiel et activer index complet

Ensuite Naviguer> Ouvrez le type de maven - vous pouvez y voir tous les artefacts disponibles basés sur la convention du paquet java

+0

Comment y arriver. Maintenant, vous devez transformer la liste des paquets en une liste de jars qui les contiennent. La liste serait grande (plusieurs versions de bibliothèques), donc vous voudriez vérifier la compatibilité d'interface et trouver le meilleur correspondant - ce serait beaucoup de travail à écrire, mais cela semble faisable. Je l'appellerais «autolinker» –

+0

Et qu'est-ce que je chercherais pour trouver les JARs? référentiel maven local? Il serait impossible de chercher dans le repo maven à distance dans cette situation – lisak

1

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 
+0

Le point de cette question est de lister toutes les classes référencées dans un JAR sous une forme lisible par l'homme: jusqu'au 3ème au 5ème niveau: "org.apache.commons.blabla". ... pour configurer une liste de dépendances pour le JAR afin de le déployer comme artefact maven – lisak

+0

Vous pouvez lire la sortie produite par la commande ci-dessus et l'utiliser pour le déploiement! – srinannapa

+0

regardez, tout ce que vous avez est un peu JAR et vous voulez créer une définition pom pour cela et le déployer comme un artefact ... Je n'ai pas de projet maven ... Je veux juste définir ses dépendances transitives ... Je Je ne suis pas sûr que vous comprenez quel est le point de cette question – lisak

2

Ma première pensée était que vous pouvez le faire en utilisant un chargeur de classe à itérer tous les fichiers de classe dans le pot 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 cette information. 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 pourriez obtenir cette information, le prochain problème consisterait à retracer les classes dans des bocaux.Dans un sens, ce serait la partie facile parce que tout ce que vous devez faire est de créer un chargeur de classe pour chaque pot dans votre repo maven, ou répertoire ou n'importe où les pots, puis demandez à chacun à son tour s'il contenait la classe spécifique. La faille dans cette pensée 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 (cela 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 renvoie une exception s'il s'avère incorrect (MethodNotFoundException). Donc, à moins que vous n'alliez analyser plus avant le bytecode pour comprendre quelles méthodes sont appelées sur chaque classe et ensuite les comparer avec les classes de votre chemin de classe, vous ne pourrez toujours pas être correct. En bref, il est probablement possible de faire ce que vous voulez, mais cela risque d'être très difficile et prendre beaucoup de temps.

La façon dont je l'habitude de traiter ce problème est de simplement tirer la classe dans le code de test et continuer à ajouter des dépendances jusqu'à ce que je peux l'obtenir pour exécuter chaque méthode que je me intéresse.

+0

Salut Derek, merci pour vos pensées. Ce serait très exigeant. Je vais accepter la réponse de MJB parce que JarAnalyzer est exactement ce que je cherchais. S'il prenait en charge la recherche d'annuaire récursive, il répertorierait pratiquement les dépendances maven dont vous avez besoin. Pas de numéros de version et de sortie utilisable bien sûr, mais vous pouvez configurer la définition de pom assez facile avec elle. – lisak

3

Si vous utilisez Maven (comme J'ai 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 (je l'utilise comme exemple mise en veille prolongée), 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> 

borne puis ouverte, allez dans le dossier contenant de l'pom.xml ci-dessus et exécutez la commande suivante:

dépendance mvn: arbre

ceci affichera une liste des dépendances ...

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

dépendance mvn: copie dépendances

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

2

Tattleltale est un outil de JBoss qui le fait

tattletale.jboss.org/

7

Vous pouvez faire ce qui suit (si son 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.

4

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 JDK 8 pour les développeurs à 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