2017-07-21 1 views
0

Je veux répertorier toutes les dépendances du fichier jar qui est créé via la construction du projet maven. Comment puis-je l'obtenir en Java? Je sais à travers la commande maven mvn:dependency mais je veux le faire par programme .. Toute aide?Comment faire pour obtenir la liste des dépendances du bocal

+0

'mvn dépendance: arbre'? que voulez-vous dire par programmation? Dans quel but? – khmarbaise

+0

je veux dire dans java .. si le chemin du fichier jar est donné puis-je apprendre à connaître ses jars dépendants (jars 3ème partie)? – NSF

+0

Le fichier jar ne va pas vraiment aider ... parce que vous avez besoin d'un fichier pom (en général, si vous construisez le fichier en utilisant Maven le fichier pom est généralement contenu dans le pot mais pas nécessairement). Jusqu'à présent, vous avez répondu à utiliser Java .. mais quel est le but de cela? Quel genre de problème essayez-vous d'atteindre? – khmarbaise

Répondre

0

En général, c'est difficile. Qu'est-ce que vous pouvez faire:

  1. Prenez le pom.xml du pot, placez-le dans un répertoire vide et appeler « la dépendance mvn: liste » par ProcessBuilder. Analyser le résultat et vous avez une liste des dépendances. Cela peut échouer, cependant, si le pom.xml ne peut pas être interprété comme le pom d'un projet indépendant (par exemple s'il fait partie d'une construction multi-module). Essayez Aether pour déterminer une liste de dépendances au lieu d'utiliser ProcessBuilder. Les problèmes potentiels sont les mêmes que ci-dessus.

+0

Au lieu de Aether vous devriez utiliser http://maven.apache.org/resolver/index.html qui est le projet Aether migré ... – khmarbaise

0

La méthode de force brute suivante peut réussir à obtenir tous les chemins absolus des fichiers jar dépendance (tiers). Remplacez 'FileUtils.getFileListRecursively' et 'FileUtils.readLines' avec vos propres méthodes.

FileUtils.getFileListRecursively("src") 

lit les chemins absolus à partir du dossier « src » de votre projet Java en cours et

FileUtils.readLines(filePath) 

lit le fichier en tant que fichier texte et renvoie toutes les lignes comme un ArrayList de chaînes.

HashSet<String> jarLocationsSet = new HashSet<>(); 

    final String importString = "import "; 
    final String javaString = "java"; 
    ArrayList<String> fileList = FileUtils.getFileListRecursively("src"); 
    for (String filePath : fileList) { 
     if (filePath.endsWith(javaString) == false){ 
      continue; 
     } 
     List<String> lines = FileUtils.readLines(filePath); 

     for (String line : lines) { 

      int isecl = line.indexOf(';'); 
      if (line.contains(importString) == false || isecl < 0){ 
       continue; 
      } 
      if (line.contains("static")){ 
       continue; 
      } 
      int start = line.indexOf(importString); 
      line = line.substring(start + importString.length(), isecl); 
      if (line.startsWith(javaString)){ 
       continue; 
      } 
      Class<?> clazz = null; 
      try { 
       clazz = Class.forName(line, false, ClassLoader.getSystemClassLoader()); 
      } catch (Exception e) { 
      } 
      if (clazz == null){ 
       continue; 
      } 


      URL location = clazz.getResource('/'+clazz.getName().replace('.', '/') + ".class"); 
      String locationString = location.toString(); 
      int jarIndex= locationString.indexOf(".jar"); 
      if (jarIndex < 0){ 
       continue; 
      } 
      locationString = locationString.substring(0, jarIndex + 4); 
      jarLocationsSet.add(locationString); 
     } 

    } 


    for (String jarLocation : jarLocationsSet) { 
     System.out.println("jarLocation = " + jarLocation); 
    } 
+0

Edit: Cette méthode peut obtenir tous les fichiers jar qui sont utilisés (une classe dans le fichier jar est utilisé) au moins une fois dans ce projet java. – Tom