İçeriğe geç

Çok Modüllü Maven — common'ı Değiştirdim, Neyi Derlemeliyim?

Orta 9 dk Sık karşılaşılır

Önce şunu oku: CI Pipeline — Geri Bildirim Neden Bu Kadar Geç Geliyor?

30 saniyede özet

Yalnızca değişen modülü derleyen build yeşil kalır ama değişikliği kullanan modülleri hiç denemez. -am bağımlı olunanları, -amd bağımlı olanları ekler; kütüphane sürümleri tek yerde, dependencyManagement'ta tutulur.

Bir lokantada şef ana sosun tarifini değiştirdi ve sosu tattı: güzel. Akşam o sosla yapılan makarna tuzlu çıktı. Sosu tatmak yetmemişti; sosu kullanan yemekleri de tatmak gerekiyordu.

  1. Bayt: common'da para hesaplayan metodu değiştirdim. Sadece common'ı derledim, yeşil!

  2. Sen: Ertesi sabah report-app'in build'i kırmızı. O metodu eski hâliyle çağırıyormuş.

  3. Bayt: Ama build yeşildi! report-app'e hiç dokunmadım ki.

  4. Bayt: Dokunmadın, ama o seni kullanıyor. Onu da derlemek gerekiyordu.

Reactor modülleri sırayla kurar

Çok modüllü bir projede Maven reactorÇok modüllü bir Maven projesinde modülleri bağımlılık sırasına dizip tek komutla kuran mekanizma. Önce kütüphaneler, sonra onları kullananlar kurulur.Sözlükte gör →, modülleri bağımlılık sırasına dizer: önce kütüphaneler, sonra onları kullananlar. mvn verify hepsini sırayla kurar.

Büyük projede hepsini kurmak uzun sürer. Bu yüzden -pl ile yalnızca seçilen modül kurulabilir. Asıl soru, seçilen modülün yanına başka neyin ekleneceğidir.

Kafam karıştı, daha basit anlat

Reactor modülleri sırayla kurar. -pl ile bir modül seçersin; geri kalanı sen eklersin.

Hızlı kontrolBaşlangıç

Çok modüllü bir Maven projesinde mvn verify modülleri hangi sırayla kurar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

mvn -pl common verify ne kurar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

-am mi, -amd mi?

common değişti. Jenkins mvn -pl common -am verify koşuyor. common'ı kullanan report-app derlenir mi? Cevabı göster

Derlenmez. -am (also make) common’ın bağımlı olduklarını ekler; common’ın bağımlılığı yok. Onu kullanan report-app’i ekleyen -amd (also make dependents) olurdu.

Sosu kullanan yemekleri de tat.
Adım adım oku
  1. Ana sosun tarifi değişti.
  2. Yalnızca sos tadıldı: güzel.
  3. Sosla yapılan makarna tuzlu.
  4. Sosu kullanan yemekleri de tat.

İki bayrak iki ayrı yöne bakar. -am yukarıya, değişen modülün kullandıklarına bakar; -amd aşağıya, onu kullananlara bakar.

Değişikliği doğrulamak için aşağıya bakmak gerekir: -amd. İkisini birlikte vermek en güvenlisidir, çünkü onu kullananların ihtiyaç duyduğu diğer modüller de aynı build’de kurulur.

Kafam karıştı, daha basit anlat

-am kullandıklarını, -amd kullananları ekler. Değişikliği -amd doğrular.

Hızlı kontrolOrta

-am (also make) ve -amd (also make dependents) arasındaki fark nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

common'daki bir metodun imzası değişti. Değişikliğin kimseyi kırmadığını doğrulamak için hangi komut gerekir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aynı kütüphane, iki sürüm

Bir modül Jackson’ın bir sürümünü, başka bir modül bir geçişli bağımlılıkSenin eklemediğin, eklediğin bir kütüphanenin kendi bağımlılığı olarak gelen kütüphane. Sürümünü çoğu zaman sen seçmezsin.Sözlükte gör → üzerinden başka bir sürümünü çekebilir. Maven ağaçta en yakın olanı seçer. Derleme geçer, hata çalışırken NoSuchMethodError olarak çıkar.

Çözüm, sürümü ana POM’daki dependencyManagement içinde bir kez yazmaktır. Birbirine bağlı kütüphane ailesi için bir BOMBill of Materials: birbirine bağlı kütüphane ailesinin uyumlu sürümlerini tek bir POM'da toplayan liste. dependencyManagement içine import edilir.Sözlükte gör → içe aktarılır; o ailenin bütün sürümleri birlikte sabitlenir.

Kafam karıştı, daha basit anlat

Kütüphane sürümünü ana POM’da bir kez yaz; modüller sürüm yazmasın.

Hızlı kontrolOrta

İki modül Jackson'ın farklı sürümlerini çekiyor; uygulama çalışırken NoSuchMethodError veriyor. Kalıcı çözüm?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Bir modül değişti: reactor neyi derliyor?

Tohum 259775
  1. common · değişti… sırada
  2. ops-tool— derlenmeyecek
  3. pricing— derlenmeyecek
  4. report-app · değişeni kullanıyor— derlenmeyecek
  5. trading-app— derlenmeyecek

Plan: common · kurulan: 0/1

Hız
Adım 0

Şu an ne oldu?

Reactor 1 modül kuracak

common

Görevler0/2

  • Build yeşil yansın, ama kırık modül yayına gitsinaçık

    İpucu

    Yalnızca değişen modülü derle.

  • common değişsin; kırılmayı hepsini derlemeden yakalaaçık

    İpucu

    Ona bağımlı olanları da derle.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Yalnızca common derlendi, build yeşil. common’ı kullanan report-app hiç derlenmedi.
  2. Komutu -am yap. Yine tek modül: common’ın bağımlı olduğu bir şey yok.
  3. Komutu -amd yap. report-app derlendi ve kırıldı; ops-tool’a hiç dokunulmadı.
  4. Değişen modülü pricing yap. Bu kez kırılan trading-app; onu da yalnızca -amd yakalar.
Hızlı kontrolOrta

Simülatörde common değişti ve -amd seçildi. Neden ops-tool hiç derlenmedi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Eski SNAPSHOT. Reactor’a girmeyen bir modül, yerel depodaki (~/.m2) belki geçen haftadan kalmış kopyadan gelir. Değişen modülü -am -amd ile kur ki onu kullananlar bugünkü kodla derlensin.

Yalnızca değişen dosyalara bakmak. Jenkins’te git diff ile değişen modülleri bulmak iyi bir fikir. Bulduğun listeye -amd eklemezsen, kullananları yine kaçırırsın.

Baştan başlamak. Uzun bir build ortada kırıldıysa, -rf :modül ile kırılan modülden devam edebilirsin. Düzelttikten sonra bir kez de baştan sona koştur.

Kafam karıştı, daha basit anlat

-am ve -amd’yi birlikte ver. Değişen modül listesine kullananları da ekle.

Hızlı kontrolOrta

Jenkins yalnızca pricing'i -pl pricing -amd ile kuruyor. trading-app, common'ın hangi kopyasıyla derlenir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aşağıda bir trading platformunun ana POM’u ve yalnızca değişen modülleri kuran Jenkins pipeline’ı var.

Derinleş · Trading platformu: sürümler tek yerde, build yalnızca etkilenenleri kurar 3 dosya · ~94 satır · ilk okumada atlayabilirsin
Proje dosyaları

pom.xml Ana POM: modüller ve bütün kütüphane sürümleri tek yerde; Jackson ailesi BOM ile birlikte sabitlenir.

pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.bank.trading</groupId>
<artifactId>trading-platform</artifactId>
<version>4.2.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>pricing</module>
<module>report-app</module>
<module>trading-app</module>
<module>ops-tool</module>
</modules>
<dependencyManagement>
<dependencies>
<!-- One version for every Jackson artifact, in every module. -->
<dependency>
<groupId>com.fasterxml.jackson</groupId>
<artifactId>jackson-bom</artifactId>
<version>2.17.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.bank.trading</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.bank.trading</groupId>
<artifactId>pricing</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

report-app/ pom.xml report-app: kütüphaneleri sürüm yazmadan kullanır; sürüm ana POM'dan gelir.

report-app/pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.bank.trading</groupId>
<artifactId>trading-platform</artifactId>
<version>4.2.0-SNAPSHOT</version>
</parent>
<artifactId>report-app</artifactId>
<dependencies>
<!-- No versions here: the parent decides. -->
<dependency>
<groupId>com.bank.trading</groupId>
<artifactId>common</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>

Jenkinsfile Jenkinsfile: değişen modülleri git diff ile bulur ve -am -amd ile onları kullananlarla birlikte kurar.

Jenkinsfile
pipeline {
agent any
tools {
jdk 'jdk-21'
maven 'maven-3.9'
}
stages {
stage('Affected modules') {
steps {
script {
def changed = sh(script: 'git diff --name-only origin/main...HEAD', returnStdout: true)
.split('\n')
.findAll { it.contains('/') }
.collect { it.split('/')[0] }
.findAll { fileExists("${it}/pom.xml") }
.unique()
// A change to the parent POM or nothing found: build everything.
env.MODULES = changed ? changed.join(',') : ''
}
}
}
stage('Build') {
steps {
script {
if (env.MODULES) {
// -am: what they use. -amd: what uses them.
sh "mvn -B -pl ${env.MODULES} -am -amd verify"
} else {
sh 'mvn -B verify'
}
}
}
}
}
}

Kendini sına

Şimşek turu1/4

-am, değişen modülü kullanan modülleri build'e ekler.

Soru 1/3İleri

Build yeşil yandı, ertesi gün report-app derlenmedi. En olası neden?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Bir modülü değiştirdiğinde, onu kullanan modüller de derlenmeli. Yalnızca değişen modülü derleyen build yeşil kalır, kırılma yayında çıkar.
  2. 2 -am değişen modülün bağımlı olduklarını, -amd ona bağımlı olanları ekler. Değişikliği doğrulayan -amd'dir; ikisi birlikte en güvenli seçimdir.
  3. 3 Aynı kütüphanenin sürümü ana POM'daki dependencyManagement'ta bir kez yazılır. Yoksa her modül başka bir sürümle derlenir ve hata çalışırken çıkar.
0/4 kart bu dersten toplandı