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

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

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

Ответ 1

К сожалению, 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): Использование специализированных библиотек отражений

гуавы

Guava имел 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...
}

Размышления

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

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

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

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

Ответ 2

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

jar tvf jarfile.jar

-t список оглавлений для архива

-v генерирует подробный вывод на стандартном выводе

-f указать имя файла архива

Ответ 3

Возможно, вы ищете команду 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 es,

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

Ответ 4

Это хак, который я использую:

Вы можете использовать java автозаполнение следующим образом:

java -cp path_to.jar <Tab>

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

Ответ 5

Вы можете использовать

jar tf example.jar

Ответ 6

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

jar tvf jarfile.jar 

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

Ответ 7

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

Ответ 8

Вы можете попробовать следующее:

unzip -v /your/jar.jar

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

Ответ 9

Описание решения: для этого можно использовать Eclipse IDE, создав образец java-проекта и добавив все jar файлы в путь сборки проекта

ШАГИ ниже:

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

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

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

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