Jak zrobić architekturę podobną do wtyczki, wykonalne?

0

Pytanie

Mamy kilka starszych Java-projektów, które możemy przekształcać w projekty / wtyczki Maven. Wcześniej wszystkie projekty były projektami NetBeans i nie miały realnego zarządzania zależnościami. Zewnętrzne zależności istniały na dysku sieciowym firmy i zostały bezpośrednio włączone w postaci plików JAR w projekty NetBeans każdego modułu. Do wewnętrznych zależności wykorzystywano proste linki na projekty. Bolało tworzyć wszystko, dlatego, że programista powinien tworzyć wszystko w odpowiedniej kolejności.

Teraz możemy otworzyć wszystkie moduły Maven w IntelliJ IDEA i NetBeans. Jednak mam problem ze znalezieniem najlepszego sposobu łączenia różnych modułów i zewnętrznych zależności, w określony sposób, co odpowiada wewnętrznej strukturze, takiej wtyczki. Szczególnie z NetBeans (opracowanie z wykorzystaniem obu IDE musi być możliwe).

Oto jak mniej więcej wygląda struktura repozytoriów / projektów git. Struktura folderów modułów jest strukturą Maven domyślnie dla każdego modułu. Funkcja listy w tym miejscu była zbyt niezdarny, dlatego podaję ją jako ekranu...

Structure Git Repos

Mamy wewnętrzne repozytorium maven dla materiałów i praca z maven, itp. Działa. Dla Intellij IDEA mogę uruchamiać i debugować produkt końcowy dla customer1 za pomocą niestandardowej konfiguracji, uruchomienia, która kopiuje odpowiednie pliki w odpowiednie struktury:

enter image description here

Z pomocą IntelliJ IDEA mogę debugować oprogramowanie, ale myślę, że podejście (utworzona mną niestandardowa konfiguracja uruchamiania IntelliJ, wskazujący bezpośrednio na wszystkie niezbędne banki i pliki) dość brzydki, i dla NetBeans nie udało mi się znaleźć podobny mechanizm uruchamiania konfiguracji".

Dlatego próbowałem wykonać ten proces montażu, tworząc nowy projekt Maven "Customer1Runnable" jako swego rodzaju złożenia opisu, który określa wszystkie niezbędne wtyczki Maven. W związku z tym pomyślałem, że mogę osiągnąć i automatyzmu w tworzeniu niezbędnej struktury oprogramowania. Dlatego, skopiuj wszystkie moduły do folderu plugins i wszystkie zależności modułów w katalogu lib w ramach projektu Customer1Runnable za pomocą wtyczki maven-assembly.

Po pierwsze, czy moje przypuszczenie, że to możliwy wariant użycia wtyczki maven-assembly-plugin?

W samym projekcie nie ma żadnych plików źródłowych, to tylko pom.xml i w assembly-config.xml dojście. Dołączony plugin-złożenie do fazy pakietu. Po uruchomieniu mvn package zespół wszystkie podłączone moduły zbudowane, ale do wykonania montażu-wtyczki otrzymuję następujący wniosek:

Windows CMD output of Customer1Runnable maven project

Na początku próbowałem włączyć w dojście do złożenia tylko jeden moduł. To XML (opicom-assembly.xml za to:

<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 projektu realizowanego przez zamawiającego 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>

Pom modułu wygląda następująco:

<?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>

Dziękuję za każdy wkład w to, co ja tutaj robię źle / jak to osiągnąć za pomocą Maven.

ZMIANY: Jak i zażądano, oto przykład projektu w postaci pliku ZIP. https://drive.google.com/drive/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k?usp=sharing Katalogi nadrzędne ModuleGroupCustomer i ModuleGroupCommon naprawdę reprezentują repozytorium git w realnym scenariuszu. Względna ścieżka do modułu spowodowane tym, że projekt maven, który powinien być moim "konfiguracją uruchamiania", wskazuje na projekty maven w obu repozytoriach.

Może być, ja rozumiem, Maven w ogóle? Myślałem o tym z punktu widzenia możliwości wykorzystania do zarządzania zależnościami, podobnych .Pakiety Net nuget, ale także jako "konfiguracja projektu", jak zwykłe projekty NetBeans/Intellij.

Czy nie lepiej po prostu trzymać się istniejących projektów NetBeans do codziennego rozwoju?

1

Najlepsza odpowiedź

0

Po długim i wyczerpującym procesu prób i błędów znalazłem rozwiązanie, które działa na mnie. Dlatego postanowiłem podzielić się rozwiązaniem w Internecie, na wypadek, gdyby ktoś jeszcze zmierzy się z podobnym problemem. Oto link na ostateczny zip-archiwum, w którym pracownicy przykłady projektów => Plik CustomerRunnable_RunningAssemblyPluginStackoverflowExample.zip >https://drive.google.com/drive/u/0/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k

Mój błąd polegał na tym, że źle zrozumiałem, jak działa plugin do montażu. Podejście, w którym wykonałem wtyczki wewnątrz mojego agregatora pom (konfigurowalny), nie jest prawidłowy, ponieważ ten projekt maven istnieje tylko jako nadrzędny pom.

Dostępna dla użytkownika pom.xml odnosi się do wszystkich klientów wtyczki jak na moduły. Moduły te mają nie konfigurowalny jako rodzica, a drugi pom. Następnie stworzyłem oddzielny projekt maven "dystrybucja". W pom.xml dystrybucja określa wszystkie wtyczki (niezbędne moduły maven dla klientów) jako zależności. On również posiada konfigurowalny pom.xml jako rodzic. Dlatego, gdy uruchamiam projekt w NetBeans, wszystkie podłączone moduły gromadzone są również(w razie potrzeby).

On również dostosowuje plugin złożenia. Wtyczka zestawu dołączony do fazy pakietu maven i w ten sposób wykonuje się z nim. Wykorzystuje również niestandardowy uchwyt montażu, który kopiuje wszystkie wcześniej określone wtyczki w odpowiednie foldery. Odbywa się to za pomocą zestawów zależności z szablonami włączenia i wyłączenia. Widzisz https://maven.apache.org/plugins/maven-assembly-plugin/advanced-descriptor-topics.html aby uzyskać więcej informacji o tym. W ten sposób jeden zestaw zależności kopiuje wszystkie pliki jar wszystkich wtyczek do folderu /plugin za pomocą szablonu włączyć. Następnie ten podejście odwrócony, aby skopiować pliki jar wszystkich zewnętrznych uzależnień w katalogu /lib.

Uchwyt określa również dodatkowe pliki do kopiowania w określone miejsce. exec-maven-plugin, więc mogę wygodnie uruchamiać oprogramowanie klienckie z NetBeans. Mi jeszcze nie udało się poprawnie skonfigurować plugin execute w odniesieniu do wymaganych argumentów drodze do klasy.

Efekt końcowy wygląda tak: Assembly folder after building

Warto również zauważyć, że w konfiguracji "Projekt montażu", "Projekt uruchomienia" i "Projekt debugowania" wewnątrz NetBeans potrzebują małej modyfikacji. (Kliknij prawym przyciskiem myszy moduł "Rozpowszechnianie" -> "Właściwości" - > kliknij > "Akcje"

2021-11-25 17:07:28

W innych językach

Ta strona jest w innych językach

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