Как сделать архитектуру, подобную плагину, работоспособной?

0

Вопрос

У нас есть несколько устаревших Java-проектов, которые мы преобразовали в проекты / модули Maven. Ранее все проекты были проектами NetBeans и не имели реального управления зависимостями. Внешние зависимости существовали на сетевом диске компании и были непосредственно включены в качестве JAR-файлов в проекты NetBeans каждого модуля. Для внутренних зависимостей использовались простые ссылки на проекты. Было больно создавать все, потому что программист должен был создавать все в правильном порядке.

Теперь мы можем открыть все модули Maven в IntelliJ IDEA и NetBeans. Однако у меня возникли проблемы с поиском наилучшего способа объединения различных модулей и внешних зависимостей определенным образом, что соответствует внутренней структуре, подобной плагину. Особенно с NetBeans (разработка с использованием обеих IDE должна быть возможной).

Вот как примерно выглядит структура репозиториев / проектов git. Структура папок модулей является структурой Maven по умолчанию для каждого модуля. Функция списка на этом сайте была слишком неуклюжей, поэтому я включил ее в качестве скриншота...

Structure Git Repos

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

enter image description here

С помощью IntelliJ IDEA я могу отлаживать программное обеспечение, но я думаю, что подход (созданная мной пользовательская конфигурация запуска IntelliJ, указывающая непосредственно на все необходимые банки и файлы) довольно уродлив, и для NetBeans я не смог найти аналогичный механизм "запуска конфигурации".

Поэтому я попытался выполнить этот процесс сборки, создав новый проект Maven "Customer1Runnable" в качестве своего рода описания сборки, которое указывает на все необходимые модули Maven. Исходя из этого, я полагал, что смогу достичь и автоматизма в создании необходимой структуры программного обеспечения. Следовательно, скопируйте все модули в папку плагинов и все зависимости модулей в папку lib внутри проекта Customer1Runnable, используя плагин maven-assembly.

Во-первых, верно ли мое предположение, что это возможный вариант использования плагина maven-assembly-plugin?

В самом проекте нет никаких исходных файлов, это всего лишь pom.xml и в assembly-config.xml дескриптор. Я прикрепил плагин-сборку к фазе пакета. При запуске mvn package команда все подключенные модули построены, но для выполнения сборки-плагина я получаю следующий вывод:

Windows CMD output of Customer1Runnable maven project

Для начала я попытался включить в дескриптор сборки только один модуль. Это XML (opicom-assembly.xml) за это:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <id>opicom-assembly</id>
    <formats>
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>
                <includes>
                    <include>my.company.reporting:module1</include>
                </includes>
        </moduleSet>
    </moduleSets>
</assembly>

pom.xml проекта, реализуемого заказчиком 1

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.6</version>
    <groupId>my.company.customer1</groupId>
    <artifactId>OpicomRunnable</artifactId>
    <packaging>pom</packaging>
    <name>OpicomRunnable</name>
    
    <repositories>
        <repository>
            <id>Company-Maven-Repo</id>
            <url>file:\\\\MyCompany\TFSDrop\MavenRepo</url>
        </repository>
    </repositories>
    
    <modules>
        <module>../my.company.customer1.module1</module>
        <module>../my.company.customer1.module2</module>
        .
        .
        .
        <module>../../MyCompany_Common/Report/my.company.reporting.module1</module>
    </modules>  
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <inherited>true</inherited>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptors>
                        <descriptor>opicom-assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Пом модуля выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>my.company</groupId>
        <artifactId>reporting</artifactId>
        <version>1.3</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>module1</artifactId>
    <version>1.3</version>
    <packaging>jar</packaging>



    <dependencies>
        <!-- external dependencies -->
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>21.1.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <finalName>my-company-${project.artifactId}</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <outputDirectory>../build</outputDirectory>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Спасибо за любой вклад в то, что я здесь делаю неправильно / как добиться этого с помощью Maven.

ИЗМЕНИТЬ: Как и было запрошено, вот пример проекта в виде ZIP-файла. https://drive.google.com/drive/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k?usp=sharing Родительские каталоги ModuleGroupCustomer и ModuleGroupCommon действительно представляют репозитории git в реальном сценарии. Относительный путь к модулю вызван тем, что проект maven, который должен быть моей "конфигурацией запуска", указывает на проекты maven в обоих репозиториях.

Может быть, я неправильно понимаю Maven в целом? Я думал об этом с точки зрения вариантов использования для управления зависимостями, подобных .Пакеты Net nuget, но также как "конфигурация проекта", как обычные проекты NetBeans/Intellij.

Не лучше ли просто придерживаться существующих проектов NetBeans для повседневной разработки?

1

Лучший ответ

0

После долгого и утомительного процесса проб и ошибок я нашел решение, которое работает на меня. Поэтому я решил поделиться решением в Интернете, на случай, если кто-то еще столкнется с подобной проблемой. Вот ссылка на окончательный zip-архив, содержащий рабочие примеры проектов => Файл CustomerRunnable_RunningAssemblyPluginStackoverflowExample.zip >https://drive.google.com/drive/u/0/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k

Моя ошибка заключалась в том, что я неправильно понял, как работает плагин для сборки. Подход, при котором я выполнил плагин внутри моего агрегатора pom (настраиваемый), неверен, так как этот проект maven существует только как родительский pom.

Доступная для пользователя pom.xml ссылается на все клиентские плагины как на модули. Эти модули имеют не настраиваемый в качестве родительского, а другой pom. Затем я создал отдельный проект maven "дистрибутив". В pom.xml дистрибутив определяет все плагины (необходимые модули maven для клиентов) как зависимости. Он также имеет настраиваемый pom.xml как родитель. Следовательно, когда я запускаю проект в NetBeans, все подключенные модули также собираются(при необходимости).

Он также настраивает плагин сборки. Плагин сборки прикрепляется к фазе пакета maven и, таким образом, выполняется с ним. Он также использует пользовательский дескриптор сборки, который копирует все ранее определенные плагины в нужные папки. Это делается с помощью наборов зависимостей с шаблонами включения и исключения. Видишь https://maven.apache.org/plugins/maven-assembly-plugin/advanced-descriptor-topics.html для получения более подробной информации об этом. Таким образом, один набор зависимостей копирует все файлы jar всех плагинов в папку /plugin с помощью шаблона включения. Затем этот подход инвертируется, чтобы скопировать файлы jar всех внешних зависимостей в папку /lib.

Дескриптор также определяет некоторые дополнительные файлы для копирования в определенное место. exec-maven-плагин, поэтому я могу с комфортом запускать клиентское программное обеспечение из NetBeans. Мне еще не удалось правильно настроить плагин execute в отношении необходимых аргументов пути к классу.

Конечный результат выглядит так: Assembly folder after building

Также стоит отметить, что конфигурации "Проект сборки", "Проект запуска" и "Проект отладки" внутри NetBeans нуждаются в небольшой модификации. (Щелкните правой кнопкой мыши модуль "Распространение" -> "Свойства" ->> пункт "Действия"

2021-11-25 17:07:28

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................