Как получить имена классов внутри jar-файла?



У меня есть файл JAR, и мне нужно получить имя всех классов внутри этого файла JAR. Как я могу это сделать?



я погуглил его и увидел что-то о JarFile или Java ClassLoader но я понятия не имею, как это сделать.

768   9  

9 ответов:

к сожалению, Java не предоставляет простой способ перечислить классы в "родной" JRE. Это оставляет вам несколько вариантов: (a) для любого данного файла JAR вы можете перечислить записи внутри этого файла JAR, найти .class файлы, а затем определить, какой класс java каждый .class файл представляет; или (b) вы можете использовать библиотеку, которая делает это за вас.

опция (a): сканирование файлов JAR вручную

в этом варианте мы будем заполнять classNames со списком всех Java классы, содержащиеся в файле jar по адресу /path/to/jar/file.jar.

List<String> classNames = new ArrayList<String>();
ZipInputStream zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
    if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
        // This ZipEntry represents a class. Now, what class does it represent?
        String className = entry.getName().replace('/', '.'); // including ".class"
        classNames.add(className.substring(0, className.length() - ".class".length()));
    }
}

опция (b): использование специализированных библиотек отражений

гуавы

гуавы имеет ClassPath по крайней мере, с 14.0, который я использовал и любил. Одна хорошая вещь о ClassPath заключается в том, что он не загружает найденные классы, что важно при сканировании большого количества классов.

ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
    // Do stuff with classes here...
}

размышления

у меня нет лично использовал размышления библиотека, но он, кажется, популярен. Некоторые отличные примеры представлены на веб-сайте, как этот быстрый способ загрузить все классы в пакете, предоставленном любой jar-файл, который также может быть полезен для вашего приложения.

Reflections reflections = new Reflections("my.project.prefix");

Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);

Вы можете использовать Java . Перечислите содержимое файла jar в txt-файле, и вы можете увидеть все классы в jar.

jar tvf jarfile.jar

может быть, вы ищете jar команда для получения списка классов в терминале,

$ jar tf ~/.m2/repository/org/apache/spark/spark-assembly/1.2.0-SNAPSHOT/spark-assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar 
META-INF/
META-INF/MANIFEST.MF
org/
org/apache/
org/apache/spark/
org/apache/spark/unused/
org/apache/spark/unused/UnusedStubClass.class
META-INF/maven/
META-INF/maven/org.spark-project.spark/
META-INF/maven/org.spark-project.spark/unused/
META-INF/maven/org.spark-project.spark/unused/pom.xml
META-INF/maven/org.spark-project.spark/unused/pom.properties
META-INF/NOTICE

здесь

-t  list table of contents for archive
-f  specify archive file name

или, просто grep выше результата, чтобы увидеть .classтолько ES

$ jar tf ~/.m2/repository/org/apache/spark/spark-assembly/1.2.0-SNAPSHOT/spark-assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar | grep .class
org/apache/spark/unused/UnusedStubClass.class

чтобы увидеть количество classЭс

jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l
61079

это хак я использую:

можно использовать java автозаполнение вот так:

java -cp path_to.jar <Tab>

это даст вам список классов, доступных для передачи в качестве начального класса. Конечно, попытка использовать тот, который не имеет основного файла, ничего не сделает, но вы можете увидеть, что java думает, что классы внутри .jar называются.

ниже команда будет перечислять содержимое jar.

: - unzip -l jarfilename.jar.

образец o / p: -

Archive: hello-world.jar Length Date Time Name --------- ---------- ----- ---- 43161 10-18-2017 15:44 hello-world/com/ami/so/search/So.class 20531 10-18-2017 15:44 hello-world/com/ami/so/util/SoUtil.class --------- ------- 63692 2 files

согласно руководству unzip

-L список архивных файлов (короткий формат). Имена, несжатые размеры файлов и даты и время изменения указанных файлов являются печатается вместе с итогами для всех указанные файлы. Если распаковать был скомпилирован с помощью OS2_EAS определено, параметр-l также содержит столбцы для размеров сохраненной OS / 2 расширенные атрибуты (EAs) и доступ к OS/2 контрольные списки (ACL). Кроме того, отображаются комментарии к zipfile и отдельным файлам (если таковые имеются). Если файл был архивируется из Единой файловой системы (например, старая файловая система MS-DOS FAT) и был задан параметр-L, имя файла преобразуется в нижний регистр и является префикс с кареткой (^).

можно попробовать:

jar tvf jarfile.jar 

Это будет полезно только в том случае, если ваш jar является исполняемым т. е. в манифесте вы определили некоторый класс как основной класс

можно использовать

jar tf example.jar

вы можете попробовать это :

unzip -v /your/jar.jar

Это будет полезно только в том случае, если ваш jar является исполняемым т. е. в манифесте вы определили некоторый класс как основной класс

описание: Eclipse IDE можно использовать для этого, создав пример проекта java и добавив все банки в путь сборки проекта

шаги:

  1. создайте пример проекта Eclipse Java.

  2. все все банки у вас есть в своем пути сборки

  3. CTRL + SHIFT+T и введите полное имя класса .

  4. результаты будут отображаться в окно со всеми банками, имеющими этот класс. Смотрите прилагаемое изображение . enter image description here

Comments

    Ничего не найдено.