Herkese merhaba bu yazımda
maven ile
profil oluşturma dan bahsedeceğim. Biraz uzun fakat ehemmiyeti büyük olan bir yazı olacak. Bir senaryo üzerinden örnekleme yaparak anlatacağım
maven profile kullanmayı. Bu arada bir parantezle belirtmek istiyorum ki
Java ile geliştirme yaparken
maven kullanan yada kullanacak olan herkese
maven profile kullanmalarını kesinlikle ve şiddetle tavsiye ediyorum.
Maven profile ne amaçla kullanıldığıyla ilgili internetten çeşitli araştırmalar yapabilirsiniz. Ben çok detaya inmeden kendi kullanımımı anlatacağım size.
Java ile geliştirme yaptığım her projede 3 farklı profilim olur benim. dev , prep ve prod diye..
- dev : Development(geliştirme yaptığım) ortamını ifade eder
- prep : preProduction dan gelir. Test ortamını ifade eder.
- prod : production ortamını ifade eder.
Peki neden 3 farklı profil size kısaca anlatayım. Öncelikle genel olarak şirketlerde kodları geliştirdiğiniz bir makine oluyor(Bu size verilen laptop). Geliştirme işlemleri bitince sizden geliştirme isteyenlerin kodlarınızı görebilmesi ve test uzmanlarının sizin geliştirdiğiniz kodu test edebilmesi için bu projeye ait bir test sunucusu oluyor. Birde testlerden onay alındıktan sonra amacına hizmet etmek üzere kodları attığınız gerçek(Erişime açılan) sunucular...
Bir projenin geliştirilip yayına çıkması bu 3 aşamadan geçerek gerçekleşir. Dolayısıyla siz geliştirme yaparken localde kullandığınız veri tabanı bilgileri ayrı, testte kullandıklarınız ayrı ve prodda kullandıklarınız ayrı olacaktır. Bu farklılıklara istinaden projenizi deploy ederken ya her sunucunun bilgilerini elle güncelleyip, compile edip, deploy edeceksiniz, yada birazdan göstereceğim şekilde maven ile profil oluşturarak bu üç farklı sunucu için üç farklı ayar dosyası oluşturacaksınız. Ve compile ederken profil seçeceksiniz.
Kısacası ; localde çalışırken maven'a kodlarımı dev profiline göre compile et, teste giderken prep'e göre ve son olarak production a çıkarken prod'a göre compile et diyeceksiniz..
NOT : Bu yazıyı sadece 4 satırlık veri tabanı ayar dosyaları üzerinden örneklendiriyorum ancak gerçek ortamlarda kod yazarken bu ayar dosyalarının farklılıkları onlarca satırı bulur ve eğer profil kullanmazsanız her deploy etmede(dev+test+prod) bu onlarca satır kodu ilgili sunucuya göre değiştirmek durumunda kalırsınız.
şimdi örneklendirmeye geçiyorum.Geliştirme yaptığımız ortamda(development) bir MySQL veri tabanımız olsun erişim bilgileri aşağıdaki gibi olsun
url : localhost
user : root
pass : 12345
|
Birde bu geliştirmeleri yaptıktan sonra tester ların bu kodları test edebilmesi için bir test sunucusu olduğunu ve tabi bu sunucu içinde bir test veri tabanımız olsun.
url : 192.168.1.110
user : rootTest
pass : 12345Test
|
son olarak geliştirmeyi yaptık, testlerden geçti ürünün yayınlandığı gerçek ortam(production) olacak birde.
url : 192.168.1.111
user : rootProd
pass : 12345Prod
|
Hemen
intelliJ ile bir
web(Spring MVC) projesi oluşturup projemizi geliştirmeye başlayalım.
projenin son hali aşağıdaki yapıda olacaktır:
İlk olarak
resources dizini altında üç profili ayırmak için üç
dev , prod ve prep diye üç farklı dizin oluşturuyoruz. Her üç dizinin altında da
config.properties dosyasını oluşturuyoruz.
Bu işlemlerden sonra
xml dosyasında
config dosyasını
load edecek şekilde ayarlıyoruz. Bu işlemler için alttaki parametreyi
mvc-dispatcher-servlet.xml dosyasına eklemek yeterlidir(classpath ten sonra gelen tüm .
properties uzantılı dosyaları yükle anlamı taşır).
mvc-dispatcher-servlet.xml
<context:property-placeholder
location="classpath*:*.properties"/>
|
bu tanımlamayı yaptıktan sonra
config.properties dosyalarını aşağıdaki şekilde düzenliyoruz.
dev/config.properties
db.url = localhost
db.user = root
db.pass = 12345
|
prep/config.properties
db.url = 192.168.1.110
db.user = rootTest
db.pass = 12345Test
|
prod/config.properties
db.url = 192.168.1.111
db.user = rootProd
db.pass = 12345Prod
|
ayar dosyalarını da tanımladıktan sonra ,
controller'a giderek yüklenen ayar dosyasındaki değerleri okuyalım.
HelloController.java
@Controller
@RequestMapping("/")
public class HelloController {
@Value("${db.url}")
public String dbUrl;
@Value("${db.user}")
public String dbUser;
@Value("${db.pass}")
public String dbPass;
@RequestMapping(method
= RequestMethod.GET)
public String
printWelcome(ModelMap model) {
model.addAttribute("message",
"Okunan Degerler!");
model.addAttribute("url",this.dbUrl);
model.addAttribute("pass",this.dbPass);
model.addAttribute("user",this.dbUser);
return
"index";
}
}
|
son olarak okunan değerlerin
view edilmesi için
index.jsp sayfasına aşağıdaki kodları ekleyelim.
index.jsp
<h3>${message}</h3>
<p><b>
user :</b>${user}</p>
<p><b>
pass :</b>${pass}</p>
<p><b>
url: </b>${url}</p>
|
Kodlamamız buraya kadardı ancak bizim maven'a giderek profil tanımlamasını henüz yapmadık. Üstte üç farklı dizine ayırdığımız ayar dosyalarını profillerle eşleştirmemiz gerekmektedir. Bu tanımlamayı yapmak için pom.xml e aşağıdaki kodları ekleyelim.
pom.xml
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<resources>
<resource>
<directory>src/main/resources/dev</directory>
</resource>
</resources>
</build>
</profile>
<profile>
<id>prep</id>
<build>
<resources>
<resource>
<directory>src/main/resources/prep</directory>
</resource>
</resources>
</build>
</profile>
<profile>
<id>prod</id>
<build>
<resources>
<resource>
<directory>src/main/resources/prod</directory>
</resource>
</resources>
</build>
</profile>
</profiles>
|
Buradaki komutlarla maven'a dev,prep ve prod diye 3 profil ID si verdik. bu profillerin ayar dosyalarının nerede olduğunu belirttik. Üstteki kodları pom.xml e ekledikten sonra sağ üste köşedeki maven tabında profil bilgileri listelenecektir. Burada hangi profili seçip maven install dersek artık maven o profile ait ayar(config.properties) dosyasını okuyarak war dosyası oluşturacaktır.
Her profil için maven clean deyip ardından maven install ettikten sonra projeyi çalıştırınca oluşan 3 farklı (profile göre) çıktı aşağıdaki gibi olacaktır.