Eklenti benzeri bir mimari nasıl çalıştırılabilir hale getirilir?

0

Soru

Maven projelerine / modüllerine dönüştürdüğümüz birkaç eski Java projemiz var. Önceden, tüm projeler NetBeans projeleriydi ve gerçek bir bağımlılık yönetimi yoktu. Şirketlerin ağ sürücüsünde dış bağımlılıklar vardı ve her modülün NetBeans projelerine doğrudan kavanoz olarak dahil edildi. İç bağımlılıklar için basit proje referansları kullanılmıştır. Her şeyi inşa etmek bir acıydı çünkü programcı her şeyi doğru sırayla inşa etmek zorundaydı.

Şimdi IntelliJ IDEA ve Netbeans'deki tüm Maven modüllerini açabilecek durumdayız. Bununla birlikte, farklı modülleri ve dış bağımlılıkları şirket içi eklenti benzeri yapıya uyan belirli bir şekilde birleştirmenin en iyi yolunu bulmakta zorlanıyorum. Özellikle NetBeans ile (her iki IDEs ile geliştirmek mümkün olmalıdır).

Git depolarının / proje yapısının kabaca nasıl göründüğü aşağıda açıklanmıştır. Modüllerin klasör yapısı, her modül için varsayılan Maven yapısıdır. Bu sitenin liste özelliği çok sakardı, bu yüzden ekran görüntüsü olarak ekledim...

Structure Git Repos

Maven vb. İle malzeme ve bina için dahili bir maven depomuz var. çalışıyor. Intellij IDEA için, gerekli dosyaları gerekli yapıda kopyalayan özel bir çalıştırma yapılandırması aracılığıyla customer1 için son ürünü çalıştırabilir ve hata ayıklayabilirim:

enter image description here

IntelliJ IDEA ile yazılımı hata ayıklayabilirim, ancak yaklaşımın (oluşturduğum özel IntelliJ run yapılandırması, gerekli tüm kavanozlara ve dosyalara doğrudan işaret ederek) oldukça çirkin olduğunu düşünüyorum ve NetBeans için benzer bir "run yapılandırması" mekanizması bulamadım.

Bu yüzden, gerekli tüm Maven modüllerine işaret eden bir tür yapı açıklaması olarak yeni bir "Customer1Runnable" Maven projesi oluşturarak bu oluşturma işlemini gerçekleştirmeye çalıştım. Buna dayanarak, gerekli yazılım yapısını oluşturmak için otomatizmi başarabileceğime inandım. Bu nedenle, maven-assembly-eklentisini kullanarak tüm modülleri bir eklenti klasörüne ve modüllerin tüm bağımlılıklarını Customer1Runnable projesinin içindeki bir lib klasörüne kopyalayın.

Öncelikle, bunun maven-assembly-eklentisi için olası bir kullanım durumu olduğu varsayımım doğru mu?

Projenin kendisinde herhangi bir kaynak dosya yok, sadece bir pom.xml ve derleme yapılandırması.xml tanımlayıcısı. Montaj eklentisini paket aşamasına ekledim. Çalıştırırken mvn package komut bağlı tüm modüller oluşturulur, ancak derleme eklentisinin yürütülmesi için aşağıdaki çıktıyı alırım:

Windows CMD output of Customer1Runnable maven project

Yeni başlayanlar için derleme tanımlayıcısına yalnızca bir modül eklemeyi denedim. Bu XML (opicom-derleme.xml) bunun için:

<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 Customer1Runnable projenin

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

Bir modülün pom değeri şuna benzer:

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

Burada yanlış yaptığım / Maven ile bunu nasıl başaracağıma dair herhangi bir giriş için teşekkürler.

DÜZENLEMEK: İstendiği gibi, burada ZİP Dosyası olarak örnek bir proje. https://drive.google.com/drive/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k?usp=sharing Üst dizinler ModuleGroupCustomer ve ModuleGroupCommon gerçek senaryoda git depolarını temsil eder. Göreceli modül yolu neden olur, çünkü "run config" olması gereken maven projesi her iki depodaki maven projelerine işaret eder.

Belki de Maven'i yanlış anlamışımdır? .NET nuget paketlerine benzer bağımlılık yönetimi için kullanım durumları açısından değil, aynı zamanda sıradan NetBeans/Intellij projeleri gibi "proje yapılandırması" olarak da düşündüm.

Günlük gelişim için mevcut NetBeans projelerine bağlı kalmak daha mı iyi?

1

En iyi cevabı

0

Uzun ve sıkıcı bir deneme yanılma sürecinden sonra, benim için çalışan bir çözüm buldum. Bu yüzden, başka birinin benzer bir sorunla karşılaşması durumunda çözümü çevrimiçi paylaşmaya karar verdim. İşte örnek projeler => CustomerRunnable_RunningAssemblyPluginStackoverflowExample dosyasını içeren son zip arşivine bir bağlantı.fermuarlı https://drive.google.com/drive/u/0/folders/1ilJeTrOPgYgUTdOP0J4BQcBnPT5fls0k

Benim hatam, montaj eklentisinin nasıl çalıştığını yanlış anladım. Eklentiyi toplayıcı pom (CustommerRunnable) içinde çalıştırdığım yaklaşım yanlıştır, çünkü bu maven projesi yalnızca ana pom olarak mevcuttur.

Müşteriye teslim edilemeyen pom.xml, tüm müşteri eklentilerine modül olarak başvurur. Bu modüller üst olarak CustommerRunnable değil, farklı bir pom var. Sonra ayrı bir maven projesi "dağıtım"oluşturdum. Bu pom.dağıtımın xml'i tüm eklentileri (gerekli müşteri maven modülleri) bağımlılık olarak tanımlar. Ayrıca CustommerRunnable pom vardır.ebeveyn olarak xml. Bu nedenle, projeyi Netbeans'te çalıştırdığımda, bağlı tüm modüller de oluşturulur (gerekirse).

Ayrıca derleme eklentisini yapılandırır. Derleme eklentisi maven paket aşamasına eklenir ve böylece onunla birlikte yürütülür. Ayrıca, önceden tanımlanmış tüm eklentileri doğru klasörlere kopyalayan özel bir derleme tanımlayıcısı kullanır. Bu, dahil et ve hariç tut desenlerine sahip bağımlılık kümeleri kullanılarak yapılır. Bakın https://maven.apache.org/plugins/maven-assembly-plugin/advanced-descriptor-topics.html bununla ilgili ayrıntılar için. Bu nedenle, bir dependencySet, tüm eklentilerin tüm jar dosyalarını bir include deseni kullanarak bir /plugin klasörüne kopyalar. Daha sonra bu yaklaşım, tüm dış bağımlılıkların jar dosyalarını bir /lib klasörüne kopyalamak için tersine çevrilir.

Tanımlayıcı, belirli bir konuma kopyalanacak bazı ek dosyaları da tanımlar. exec-maven-eklentisi, böylece müşteri yazılımını Netbeans'ten rahatça başlatabilirim. Execute eklentisini gerekli sınıf yolu argümanlarıyla ilgili olarak doğru şekilde yapılandırmayı henüz başaramadım.

Endresult şuna benziyor: Assembly folder after building

NetBeans içindeki "Proje oluştur", "Projeyi çalıştır" ve "Hata ayıklama projesi" yapılandırmalarının biraz değiştirilmesi gerektiğini de belirtmek gerekir. ("Dağıtım" Modülüne Sağ tıklayın - > "Özellikler" - > > "Eylemler"i işaretleyin

2021-11-25 17:07:28

Diğer dillerde

Bu sayfa diğer dillerde

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