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. А затем, во втором подходе, мы научились писать программу, которая находит банку, используемую во время выполнения, из пути к классам для создания экземпляра класса.
Оба метода эффективны, но у них есть свои варианты использования.