Перейти к основному содержимому

Найти все банки, содержащие данный класс

· 2 мин. чтения

1. Введение

В этой статье мы научимся находить все банки, содержащие определенный класс. Мы продемонстрируем это, используя два разных подхода, а именно командный и программный.

2. На основе команд

В этом подходе мы будем использовать команду оболочки для идентификации всех jar-файлов в локальном репозитории maven, которые имеют класс ObjectMapper . Давайте начнем с написания сценария для идентификации класса в банке. Сценарий использует команду jar и grep для печати соответствующего файла jar:

jar -tf $1 | grep $2 && echo "Found in : $1"

Здесь $1 — это путь к файлу jar, а $2 — имя класса. В этом сценарии имя класса всегда будет com.fasterxml.jackson.databind.ObjectMapper . Давайте сохраним приведенную выше команду в bash-файле findJar.sh . После этого мы запустим следующую команду find в локальном репозитории maven с помощью findJar.sh , чтобы получить результирующие банки:

$ find ~/.m2/repository -type f -name '*.jar' -exec ./findJar.sh {} com.fasterxml.jackson.databind.ObjectMapper \;
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$1.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$2.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$3.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$DefaultTypeResolverBuilder.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$DefaultTyping.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper.class
Found in : <strong>/home/user/.m2/repository/com/spotify/docker-client/8.16.0/docker-client-8.16.0-shaded.jar</strong>
com/fasterxml/jackson/databind/ObjectMapper$1.class
com/fasterxml/jackson/databind/ObjectMapper$2.class
com/fasterxml/jackson/databind/ObjectMapper$3.class
com/fasterxml/jackson/databind/ObjectMapper$DefaultTypeResolverBuilder.class
com/fasterxml/jackson/databind/ObjectMapper$DefaultTyping.class
com/fasterxml/jackson/databind/ObjectMapper.class
Found in : <strong>/home/user/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.12.3/jackson-databind-2.12.3.jar</strong>

3. Программа на основе

В программном подходе мы напишем класс Java, чтобы найти класс ObjectMapper в пути к классам java. Мы можем отобразить банку, как показано ниже:

public class App { 
public static void main(String[] args) {
Class klass = ObjectMapper.class;
URL path = klass.getProtectionDomain().getCodeSource().getLocation();
System.out.println(path);
}
}

Выход:

file:/Users/home/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.12.3/jackson-databind-2.12.3.jar

Здесь мы видим, что каждый класс Class имеет getProtectionDomain().getCodeSource().getLocation() . Этот метод предоставляет файл jar, в котором существует нужный класс. Следовательно, мы можем использовать его для получения файла jar, имеющего класс.

4. Вывод

В этой статье мы изучили командные и программные подходы к поиску классов в списке jar-файлов.

Сначала мы начали с иллюстративного примера. После этого мы изучили подход на основе команд для идентификации данного класса из локального репозитория maven. А затем, во втором подходе, мы научились писать программу, которая находит банку, используемую во время выполнения, из пути к классам для создания экземпляра класса.

Оба метода эффективны, но у них есть свои варианты использования.