Par programme liste inclus bibliothèques Java


Je travaille sur un projet qui utilise de nombreuses bibliothèques de sécurité/utilitaires. Pour des raisons de sécurité, j'aimerais pouvoir informer l'utilisateur des bibliothèques que nous utilisons et de la version en cours d'exécution dans leur corbeille. Beaucoup de nos utilisateurs ont choisi de modifier notre code donc je préfère le faire par programmation.

J'ai essayé d'analyser le classpath mais cela ne semble pas aider lorsque le programme est empaqueté dans un fichier jar. J'ai également essayé de lister tous les noms de classe dans le POT, mais ce n'est pas le cas transmettre toutes les informations de version.

Toutes nos bibliothèques ont la version dans le nom du fichier jar. Je suis ouvert à faire une sorte de script de compilation. Nous construisons en utilisant ant et intellij. Ant est le seul que j'ai besoin de soutenir, intellij rend la vie plus facile.

Author: Kyle Berezin, 2017-10-19

2 answers

Si le fichier jar est dans le chemin de la classe, vous pouvez utiliser les propriétés système pour obtenir les fichiers jar.

  String path = System.getProperty("java.class.path");
  String[] p;
  p = path.split(";");
  for(int i=0; i< p.length; i++) {
      System.out.println(p[i]);
  }

Pour l'exemple ci-dessus, c'est ce que j'ai utilisé pour renvoyer toutes mes bibliothèques d'applications Web à partir du serveur. Vous pouvez faire de même pour obtenir les pots que vous voulez.

Si vous les avez empaquetés dans un jar, vous devez le charger à partir du répertoire de classe lui-même, vous pouvez essayer classloader.

 ClassLoader loader = ClassLoader.getSystemClassLoader();
 URL[] urls = ((URLClassLoader)loader).getURLs();
 for(URL url: urls){
    System.out.println(url.getFile());
 }
 0
Author: logger, 2017-10-19 19:39:56

J'ai pu le faire en analysant le MÉTA-INF/maven/org/blah/pom.les propriétés des fichiers. Cela ne fonctionne que pour les bibliothèques qui ont un support maven (bien que votre projet n'ait besoin de rien lié à maven).

private static HashMap<String,String> getVersionMap () {
    //Results by <lib name, version>
    final HashMap<String,String> resultMap = new HashMap<>();
    try {
        //Hack to get a ref to our jar
        URI jarLocation = new URI("jar:" + SecurityInfo.class.getProtectionDomain().getCodeSource().getLocation().toString());
        //This jdk1.7x nio util lets us look into the jar, without it we would need ZipStream
        FileSystem fs = FileSystems.newFileSystem(jarLocation, new HashMap<String,String>());

        Files.walkFileTree(fs.getPath("/META-INF/maven"), new HashSet<FileVisitOption>(), 3, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                if (file.toString().endsWith(".properties")) {
                    try {
                        List<String> data = Files.readAllLines(file, Charset.defaultCharset());
                        String id = data.get(4);
                        id = id.substring(id.lastIndexOf('=') + 1);
                        String version = data.get(2);
                        version = version.substring(version.lastIndexOf('=') + 1);
                        resultMap.put(id, version);
                    }
                    catch(Exception ignore) {}
                }
                return FileVisitResult.CONTINUE;
            }
        });
    } catch(Exception ignore) {
        return new HashMap<>();
    }
    return resultMap;
}
 0
Author: Kyle Berezin, 2017-10-28 04:49:38