15 Eylül 2014 Pazartesi

Maven Profil Oluşturma (Dev + Preprod + Prod)

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.




kaynak dosyalar(github) : indirmek için tıklayın


Hiç yorum yok:

Yorum Gönder