Exec Maven Plugin: Maven Build Sürecinde Java Programlarını Çalıştırma Rehberi
Maven, Java projeleri için endüstri standardı bir build otomasyon aracıdır. Bağımlılık yönetimi, derleme, test etme, paketleme ve dağıtma gibi birçok görevi standartlaştırılmış bir şekilde ele alır. Ancak Maven’ın gerçek gücü, “plugin” adı verilen genişletilebilir mimarisinde yatar. Plugin’ler, Maven’ın çekirdek yeteneklerini genişletir ve geliştiricilere projelerinin yaşam döngüsü boyunca çeşitli özel görevleri yerine getirme imkanı sunar. Bu makalede, Maven’ın en kullanışlı plugin’lerinden biri olan “Exec Maven Plugin”i derinlemesine inceleyeceğiz. Bu plugin, Maven build sürecinin herhangi bir aşamasında Java programlarını veya harici komutları çalıştırmak için tasarlanmıştır.
Maven ve Plugin Mekanizması
Maven, proje yönetimini ve build sürecini basitleştirmek için “Project Object Model” (POM) adı verilen XML tabanlı bir yapı kullanır. POM dosyası (pom.xml), projenin tüm konfigürasyonunu, bağımlılıklarını, plugin’lerini ve build profilini tanımlar. Maven’ın çalışma prensibi, bir yaşam döngüsü (lifecycle) etrafında döner. Bu yaşam döngüsü, validate, compile, test, package, install, deploy gibi önceden tanımlanmış aşamalardan (phases) oluşur.
Plugin’ler, Maven’ın bu yaşam döngüsüne entegre olan ve belirli görevleri (goals) yerine getiren modüler bileşenlerdir. Her plugin, bir veya daha fazla “goal” içerir. Örneğin, maven-compiler-plugin‘in compile goal’ü, Java kaynak kodunu derler. Bu goal, genellikle compile yaşam döngüsü fazına bağlanır. Geliştiriciler, pom.xml dosyasında plugin’leri tanımlayarak ve onları belirli yaşam döngüsü fazlarına bağlayarak build sürecini özelleştirebilirler. Bir plugin’i kullanmak için, genellikle etiketinin altında bölümüne eklenir ve etiketi altında çeşitli parametrelerle ayarlanır.
Exec Maven Plugin de bu mekanizmanın bir parçasıdır. Temel amacı, Maven’ın kontrolü altında harici programları çalıştırmaktır. Bu programlar bir Java sınıfı olabileceği gibi, bir shell scripti, Python scripti veya herhangi bir yürütülebilir dosya da olabilir. Bu esneklik, geliştiricilere build sürecine özel otomasyon adımları eklemeleri için güçlü bir araç sunar.
Exec Maven Plugin’e Giriş
Exec Maven Plugin, Maven build sürecinden bağımsız Java uygulamalarını veya harici sistem komutlarını çalıştırmak için tasarlanmıştır. Bu, özellikle aşağıdaki senaryolarda son derece faydalıdır:
* Ana Uygulamayı Çalıştırma: Bir Maven projesinin ana Java sınıfını doğrudan Maven komutuyla çalıştırmak.
* Yardımcı Programlar ve Scriptler: Build sürecinin bir parçası olarak veritabanı migrasyonları, kod üretimi, dosya işleme gibi yardımcı scriptleri veya programları çalıştırmak.
* Entegrasyon Testleri: Entegrasyon testlerinden önce bir test sunucusu başlatmak veya test verilerini hazırlamak.
* Özel Build Adımları: Maven’ın standart yaşam döngüsüne uymayan özel adımları entegre etmek.
Exec Maven Plugin’i projenize eklemek için pom.xml dosyanızın bölümüne aşağıdaki gibi bir girişi eklemeniz gerekir:
org.codehaus.mojo
exec-maven-plugin
3.1.1
java
Yukarıdaki örnekte, groupId, artifactId ve version ile plugin’i tanımladık. bölümü, plugin’in belirli bir Maven yaşam döngüsü fazında çalıştırılmasını sağlar, ancak bu isteğe bağlıdır. Genellikle, plugin’i doğrudan komut satırından çalıştırmak için bu bölüm gerekli değildir. etiketi ise plugin’in davranışını özelleştirmek için kullanılır.
Exec Maven Plugin’in iki ana goal’ü vardır:
1. java goal’ü: Bir Java sınıfını ayrı bir JVM sürecinde çalıştırmak için kullanılır. Bu goal, genellikle projenin kendi Java sınıflarını veya bağımlılıklarındaki sınıfları çalıştırmak için tercih edilir. Classpath yönetimi Maven tarafından otomatik olarak yapılır.
2. exec goal’ü: Herhangi bir harici programı veya scripti çalıştırmak için kullanılır. Bu, java komutu, sh scriptleri, python programları veya herhangi bir yürütülebilir dosya olabilir. Classpath yönetimi genellikle manuel olarak veya harici programın kendi mekanizmalarıyla yapılır.
Farklı Çalıştırma Senaryoları ve Konfigürasyonlar
Exec Maven Plugin, çeşitli senaryolara uyacak şekilde zengin konfigürasyon seçenekleri sunar. Şimdi bu senaryoları ve ilgili konfigürasyonları detaylıca inceleyelim.
Tek Bir Java Sınıfını Çalıştırma (java goal’ü)
Exec Maven Plugin’in java goal’ü, projenizin veya bağımlılıklarınızın classpath’ında bulunan bir Java sınıfını çalıştırmanın en basit yoludur. Bu, genellikle projenizin ana uygulamasını başlatmak veya küçük bir yardımcı Java programını çalıştırmak için kullanılır.
org.codehaus.mojo
exec-maven-plugin
3.1.1
com.example.myapp.MyApplication
arg1
arg2
my.property
myValue
runtime
Yukarıdaki konfigürasyonda:
* : Çalıştırılacak Java sınıfının tam nitelikli adını (package dahil) belirtir. Bu zorunlu bir parametredir.
* : mainClass‘a geçirilecek komut satırı argümanlarını tanımlar. Her etiketi ayrı bir argümanı temsil eder.
* : Çalıştırılan JVM’e geçirilecek sistem özelliklerini tanımlar. Her etiketi bir anahtar-değer çifti içerir.
* : Çalıştırılan Java programı için classpath’a dahil edilecek bağımlılıkların kapsamını belirler. Olası değerler: compile, runtime, test. Varsayılan değer runtime‘dır, yani hem derleme hem de çalışma zamanı bağımlılıkları dahil edilir. test olarak ayarlanırsa, test bağımlılıkları da classpath’a eklenir.
Bu konfigürasyonla, uygulamanızı aşağıdaki komutla çalıştırabilirsiniz:
mvn exec:java
Eğer mainClass‘ı doğrudan komut satırından belirtmek isterseniz:
mvn exec:java -Dexec.mainClass="com.example.myapp.MyApplication" -Dexec.args="arg1 arg2" -Dexec.systemProperties="my.property=myValue"
Bu, pom.xml‘deki konfigürasyonu geçersiz kılar ve dinamik çalıştırmalar için kullanışlıdır.
Harici Komutları veya Scriptleri Çalıştırma (exec goal’ü)
exec goal’ü, Maven’ın dışında herhangi bir programı veya scripti çalıştırmak için kullanılır. Bu, bir shell scripti, bir Python programı, bir veritabanı istemcisi veya hatta başka bir Java uygulamasının kendi başlatıcısı olabilir.
org.codehaus.mojo
exec-maven-plugin
3.1.1
python
${project.basedir}/scripts
myscript.py
--param
value
someValue
--long-param=longValue
Yukarıdaki konfigürasyonda:
* : Çalıştırılacak programın veya scriptin adını/yolunu belirtir. Eğer program PATH’te değilse, tam yolunu belirtmek gerekebilir (örn. /usr/local/bin/python).
* : Komutun çalıştırılacağı dizini belirtir. Varsayılan olarak proje kök dizinidir (${project.basedir}).
* : Çalıştırılan programa geçirilecek komut satırı argümanlarını tanımlar.
* : Çalıştırılan programa özel ortam değişkenlerini tanımlar.
* : Tek bir argüman olarak ayrıştırılacak uzun argümanları belirtir (örneğin, --param=value). Bu, ile aynı işlevi görür ancak bazı durumlarda daha okunaklı olabilir.
Bu konfigürasyonla, scriptinizi aşağıdaki komutla çalıştırabilirsiniz:
mvn exec:exec
Komut satırından executable ve arguments belirtmek için:
mvn exec:exec -Dexec.executable="ls" -Dexec.args="-l"
Bağımsız Bir JAR Dosyasını Çalıştırma
Bazen, Exec Maven Plugin kullanarak önceden paketlenmiş bir JAR dosyasını çalıştırmak isteyebilirsiniz. Bu, iki şekilde yapılabilir:
1. java goal’ü ile (eğer JAR’ın içinde Main-Class belirtilmişse):
Bu yöntem, JAR’ın kendi manifest dosyasında Main-Class özniteliği tanımlanmışsa çalışır. Exec Maven Plugin, bu durumda JAR’ı classpath’a ekler ve Main-Class‘ı otomatik olarak bulur.
org.codehaus.mojo
exec-maven-plugin
3.1.1
compile
com.example.myjar.MainClass
${project.build.directory}/my-app.jar
Ancak bu yöntem genellikle mainClass‘ı doğrudan sizin projenizin bir sınıfı olarak belirtmek için kullanılır. Eğer bir JAR’ı çalıştırmak istiyorsanız ve JAR’ın içindeki Main-Class‘ı kullanmak istiyorsanız, genellikle exec goal’ü ile java -jar komutunu taklit etmek daha yaygındır.
2. exec goal’ü ile (java -jar komutunu taklit ederek):
Bu, en esnek yoldur ve JAR’ın kendi Main-Class‘ını kullanmasını sağlar.
org.codehaus.mojo
exec-maven-plugin
3.1.1
java
-jar
${project.build.directory}/${project.build.finalName}.jar
arg1
arg2
Burada, executable olarak java komutunu, arguments olarak da -jar ve çalıştırılacak JAR dosyasının yolunu belirtiyoruz. ${project.build.directory}/${project.build.finalName}.jar ifadesi, Maven’ın paketlediği JAR dosyasının yolunu dinamik olarak elde etmek için kullanılır.
Maven Yaşam Döngüsüne Bağlama
Exec Maven Plugin’i bir Maven yaşam döngüsü fazına bağlamak, belirli bir aşamada otomatik olarak çalışmasını sağlar. Bu, özellikle entegrasyon testleri, dağıtım öncesi adımlar veya özel doğrulama kontrolleri için kullanışlıdır. Bu bağlama işlemi etiketi altında yapılır.
org.codehaus.mojo
exec-maven-plugin
3.1.1
run-integration-tests-setup
pre-integration-test
java
com.example.test.TestSetup
setup
run-post-build-script
package
exec
sh
./scripts/post-build.sh
${project.version}
Yukarıdaki örnekte iki farklı execution tanımlanmıştır:
* Birincisi, pre-integration-test fazında com.example.test.TestSetup sınıfını çalıştırır. Bu, entegrasyon testleri başlamadan önce gerekli ortamı hazırlamak için kullanılabilir.
* İkincisi, package fazından sonra ./scripts/post-build.sh scriptini çalıştırır ve projenin versiyonunu argüman olarak geçirir. Bu, paketleme sonrası özel işlemler (örneğin, dağıtım için ek dosyalar hazırlama) için kullanılabilir.