Есть ли способ создать maven-зависимость в pom-файле из локального jar-файла? - PullRequest
1 голос
/ 24 сентября 2019

Существует java-проект, в котором слишком много jar-файлов, и стало трудно управлять ими всеми.Я знаю, что есть способ преобразовать этот проект в проект maven, но я не хочу вручную добавлять зависимость для каждого jar в моем проекте в файл pom.

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

Редактировать: Я хочу уточнить, что я не хочу добавлять jar из / в локальный репозиторий.Подход с локальным репозиторием не будет работать для меня, так как проект будет использоваться несколькими пользователями в разных системах.

Я хотел создать регулярные записи зависимостей pom вместе с groupId, artifactId и версией для файлов jar, которые я ужетак, чтобы я мог скопировать и вставить его в файл pom, когда я конвертирую свой проект в проект Maven.Поскольку в моем проекте большое количество JAR-файлов, мне придется делать все вручную.

Решение, предоставленное @Milen Dyankov, сработало для меня.Мне удалось получить необходимую информацию из большинства файлов JAR.

Ответы [ 4 ]

2 голосов
/ 24 сентября 2019

Вы можете установить JAR вручную в свой локальный репозиторий Maven

Первый путь

Выполните следующие действия

mvn install:install-file -Dfile=<path-to-file>

И здесь вы можете добавить эту информацию в командной строке

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version>

<path-to-file> упомянутый путь к JAR для установки

<group-id> упомянутый идентификатор группы дляJAR для установки

<artifact-id> упомянутый идентификатор артефакта JAR для установки

<version> упомянутая версия JAR

Second Way

Вы можете создать другой локальный репозиторий Maven

Выполните шаги

, мы можем считать, что новый локальный репозиторий Maven называется maven-repository и находится в ${basedir} (каталогсодержащий pom.xml).

Развертывание локальных JAR-файлов в новом локальном репозитории Maven, как показано ниженаходится на локальном компьютере

После установки JAR-файлов вам необходимо добавить репозиторий в ваш файл pom.xml

<repositories>
    <repository>
        <id>maven-repository</id>
        <url>file:///${project.basedir}/maven-repository</url>
    </repository>
</repositories>
0 голосов
/ 27 сентября 2019

То, что вам нужно, это ваша локальная сеть maven, которая доступна только на вашем сервере.Учитывая, что у вас есть банки, которые доступны только вам, я думаю, у вас есть источники для них.В результате вы сможете преобразовать их в maven проекты и развернуть их в своем локальном нексусе.После исправления структуры maven загрузит ваши зависимости и зависимости при разрешении проекта.

Или вы можете использовать <scope>system</scope>, но это требует абсолютных путей и, как правило, не рекомендуется.

0 голосов
/ 24 сентября 2019

Этот код

    public static void main(String[] args) throws IOException {
        Set<String> missingMavenData = new HashSet<String>();
        String FOLDER = "/path/to/your/folder/with/jars";

        Files
         .walk(Paths.get(FOLDER), FileVisitOption.FOLLOW_LINKS)
         .map(Path::toFile)
         .filter(f -> f.isFile())
         .filter(f -> f.getName().endsWith(".jar"))
         .map(f -> {
            try {
                return new JarFile(f);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
         })
         .filter(Objects::nonNull)
         .map(jar -> {
             Properties properties = null;
             Enumeration<JarEntry> entries = jar.entries();
             while (entries.hasMoreElements()) {
                 JarEntry jarEntry = entries.nextElement();
                 if (jarEntry.getName().matches("^META-INF/maven/.*/pom\\.properties$")) {
                     try {
                         properties = new Properties();
                         properties.load(jar.getInputStream(jarEntry));
                         break;
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 };
             } 
             if (properties == null) {
                 missingMavenData.add(jar.getName());
             }
             return properties;
         })
         .filter(Objects::nonNull)
         .forEach(properties -> {
            System.out.println("<depencency>");
            System.out.println("    <groupId>" + properties.getProperty("groupId")+ "</groupId>");
            System.out.println("    <artifactId>" + properties.getProperty("artifactId")+ "</artifactId>");
            System.out.println("    <version>" + properties.getProperty("version")+ "</version>");
            System.out.println("</depencency>");
         });

        System.out.println("Those JAR files does not contain Maven metadata:");
        missingMavenData.forEach(System.out::println);
    }

будет перебирать ваши файлы jar и пытаться найти в них метаданные Maven.Он сгенерирует записи POM для тех, у кого он есть, и перечислит тех, у кого его нет, чтобы вы могли добавить его вручную.Надеюсь, это поможет.

ОБНОВЛЕНИЕ:

Я добавил bom-helper:fromJars цель к Плагин вспомогательной техники Maven , который делает более или менее то же самоекак приведенный выше код.Теперь можно просто добавить плагин

<plugin>
    <groupId>com.commsen.maven</groupId>
    <artifactId>bom-helper-maven-plugin</artifactId>
    <version>0.2.0</version>
</plugin>

и настроить его для вызова fromJars goal.Это также можно назвать формой командной строки.Например:

mvn bom-helper:fromJars \
 -Dbom-helper.jarsFolder=/path/to/folder/with/jars \
 -Dbom-helper.inplace=true \
 -Dbom-helper.recursive

обновит текущий pom с записями для всех jar-файлов, содержащих метаданные Maven.

0 голосов
/ 24 сентября 2019

AFAIK, Maven не может это сделать.

Вы можете написать скрипт, который вычисляет значение SHA1 для каждой банки и ищет ее в вашем хранилище Maven.Альтернативно, он может открыть банки и найти pom.properties, чтобы извлечь координаты Maven.

В любом случае, это, вероятно, слишком большое программирование, если вам не нужно делать это для многих проектов.

...