У меня есть JAR файл, и мне нужно получить имя всех классов внутри этого JAR файла. Как я могу это сделать?
Я просмотрел его и увидел что-то о JarFile или Java ClassLoader
, но я понятия не имею, как это сделать.
У меня есть JAR файл, и мне нужно получить имя всех классов внутри этого JAR файла. Как я могу это сделать?
Я просмотрел его и увидел что-то о JarFile или Java ClassLoader
, но я понятия не имею, как это сделать.
К сожалению, Java не предоставляет простой способ перечислить классы в "родной" JRE. Это оставляет вам несколько вариантов: (a) для любого данного JAR файла вы можете перечислить записи внутри этого JAR файла, найти файлы .class
, а затем определить, какой Java-класс представляет каждый .class
файл; или (b) вы можете использовать библиотеку, которая сделает это для вас.
В этой опции мы заполним 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()));
}
}
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);
Вы можете использовать инструмент Java jar
. Перечислите содержимое файла JAR в текстовом файле, и вы можете увидеть все классы в банке.
jar tvf jarfile.jar
-t список оглавлений для архива
-v генерирует подробный вывод на стандартном выводе
-f указать имя файла архива
Возможно, вы ищете команду 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
Это хак, который я использую:
Вы можете использовать java
автозаполнение следующим образом:
java -cp path_to.jar <Tab>
Это даст вам список классов, доступных для прохождения в качестве стартового класса. Конечно, попытка использовать тот, у которого нет основного файла, ничего не сделает, но вы можете видеть, что java
считает, что классы внутри .jar
вызываются.
Вы можете использовать
jar tf example.jar
Вы можете попробовать:
jar tvf jarfile.jar
Это будет полезно, только если ваш 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 список архивных файлов (короткий формат). Имена, несжатые размеры файлов, даты и время изменения указанных файлов напечатаны вместе с итогами для всех файлов. Если UnZip был скомпилирован с установленным OS2_EAS, опция -l также содержит столбцы для размеров хранимой OS/2 расширенные атрибуты (EAs) и доступ к ОС /2 контрольные списки (ACL). Кроме того, отображаются комментарии zipfile и отдельные комментарии к файлам (если есть). Если файл был архивируется из файловой системы в одном случае (например, старая файловая система MS-DOS FAT) и параметр -L, имя файла преобразуется в нижний регистр и с префиксом каретки (^).
Вы можете попробовать следующее:
unzip -v /your/jar.jar
Это будет полезно, только если ваш jar выполним, т.е. в манифесте вы определили некоторый класс как основной класс
Описание решения: для этого можно использовать Eclipse IDE, создав образец java-проекта и добавив все jar файлы в путь сборки проекта
ШАГИ ниже:
Создайте пример проекта Java Eclipse.
Все банки, которые у вас есть на пути сборки
CTRL + SHIFT + T и введите полное имя класса.
Результаты будут отображены в окне со всеми банками, имеющими этот класс. Смотрите прикрепленную картинку.