Как получить правильный идентификатор региона из пути к классу зависимостей в Java?

#java #spring #maven #dependencies

Вопрос:

Я хочу получить идентификаторы групп зависимостей, которые использует мое приложение. У меня есть списки путей к файлам, которые локально выглядят следующим образом:

 /Users/myName/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar  /Users/myName/.m2/repository/org/springframework/spring-context/5.2.2.RELEASE/spring-context-5.2.2.RELEASE.jar  /Users/myName/.m2/repository/org/springframework/boot/spring-boot-actuator/2.2.2.RELEASE/spring-boot-actuator-2.2.2.RELEASE.jar  /Users/myName/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar  

Похоже, у нас есть шаблон, считая от конца косыми чертами, у нас есть jar, версия, артефакт, а затем есть groupId. Но хитрость в том, что не всегда идентификатор группы содержит одинаковое количество слов, в jakarta.аннотации и org.springframework их 2, иногда 3 или только 1.

Кроме того, не всегда путь выглядит одинаково, я полагаю, что на сервере его нет в каталоге .m2/репозитория.

Кто-нибудь знает, как получить идентификаторы групп из зависимостей в нашем приложении?

Комментарии:

1. Здравствуйте, можете ли вы вместо этого проанализировать файл pom для вашего приложения? Или можно использовать дерево зависимостей mvn:, а затем проанализировать результат?

Ответ №1:

Вы оставляете последние два имени каталога и имя файла, затем получаете идентификатор группы.

Пример:

/Users/myName/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar

ведет к jakarta/annotation , затем замените / на . , и вы закончили.

Комментарии:

1. Что, если есть только один? как /Users/myName/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar И как я узнаю, сколько их там?

2. То же правило. Вы пропускаете junit/4.13.1/junit-4.13.1.jar , поэтому результирующий идентификатор группы равен junit . Так что не имеет значения, есть ли один, два или, может быть, пять. Просто возьмите все после .../repository/ и опустите последние два каталога и имя файла.

3. Я верю , что так бывает не всегда .../repository/ , вот в чем дело. Я написал это в описании вопроса. Локально нормально, но что на сервере? Мне нужно универсальное решение.

4. Хорошо, я недостаточно внимательно прочитал вопрос. Если у вас нет возможности определить базовый каталог, то этот метод на самом деле неприменим. Тогда, возможно, было бы лучше использовать dependency:tree или для добавления списка зависимостей во время сборки в какой-либо файл, как в METAINF.

5. Есть ли возможность использовать dependency:tree в обычной java? Если нет, то как я могу реализовать такое решение как функцию в java, spring?