it-swarm.com.ru

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

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

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

93
sticksu

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

Вариант (а): сканирование файлов 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()));
    }
}

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

Гуайява

Гуава имел 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 , но она, похоже, очень понравилась. На веб-сайте представлены некоторые замечательные примеры, такие как этот быстрый способ загрузки всех классов в пакете, предоставленном файлом any JAR, который также может быть полезен для вашего приложения.

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

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

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

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

jar tvf jarfile.jar
150
Sanjeev Gupta

Может быть, вы ищете команду 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 выше результата, чтобы увидеть только .classes

$ 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

Чтобы увидеть количество classes, 

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

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

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

Java -cp path_to.jar <Tab>

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

9
stanm

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

jar tf example.jar
6
Achyuth

Команда ниже выведет список содержимого файла jar

команда: - unzip -l jarfilename.jar.

образец о/п: - 

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

5
Amit Khandelwal

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

jar tvf jarfile.jar 

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

4
Pallav

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

unzip -v /your/jar.jar

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

2
Abhimanyu Dutta

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

ШАГИ ниже :

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

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

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

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

0
Arokiadoss Asirvatham