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