Oldalak

2015. május 14., csütörtök

Maven multimodul projekt létrehozása

A sokféle projektstruktúra közül nekem az tetszett meg amikor a projektet külön bontjuk modulokra, amennyire logikusnak tartjuk és abba pakoljuk az osztályainkat.

Egy alap n rétegű enterprise struktúra tartalmaz minimum három réteget. Van integrációs, szolgáltatási, illetve megjelenítési réteg. Természetesen a konkrét feladat fogja meghatározni hogy hogyan szabdaljuk szét a projektjeinket.

Ez a Maven struktúra az úgynevezett multimodul struktúra. A lényege hogy egyetlen Maven projekt alatt több Maven modult is létrehozunk szétválasztva ezzel az alkalmazásunk osztályait.
A fordításkor gyakorlatilag egyetlen ear állományt kapunk ami tartalmazni fogja a megadott strulktúrában a jar fájlokat amik vagy az EJB konténerbe, vagy az ACC-be (Application Client Container) fognak betöltődni, illetve tartalmazza majd a war fájlunkat, ami pedig a web konténerbe fog kerülni.

A Maven fog gondoskodni arról hogy összecsomagolja az egész alkalmazást egyetlen ear fájlba, ami könnyen deployolható (telepíthatő) az alkalmazásszerverbe (pl GlassFish).

Hozzunk létre egy Maven projektet.
New/Other.../Maven/Maven project

Teljesen üres projektet akarunk nem kell archetípus, ezért a Create a simple project (skip archetype selection) opció legyen bejelölve!


Group Id és Artifact Id megadása után a Packaging legyen pom. Ezzel mondjuk meg hogy további modulokat fog tartalmazni a projekt. 

A szülő projekten hozzuk létre a Maven modulokat az integrációs és a szolgáltatási rétegnek.
New/Other.../Maven/Maven module

Itt is egyszerű projekt kell és a Parent projektnek adjuk meg a pom projektünket.
Egyből jöhet a Finish!

A szolgáltatási rétegnek ugyan így hozzunk létre egy modult.
Ezekből a modulokból jar fájlok lesznek. Ezt ugyan nem láttuk mert egyből Finish-t nyomtunk a létrehozáskor, de ha Next-el megyünk tovább, akkor látható hogy alapértelmezésnek jar van beállítva a Packaging-nál. Ebből kifolyólag a modulok szerkezete más lesz.


Végül a szülő projekten hozzuk létre a Maven modulként a megjelenítési rétegnek a web projektet is. 
New/Other.../Maven/Maven module

Itt most egy web modult fogunk létrehozni amihez egy archetípust fogunk használni.
Ezért a Create a simple project (skip archetípe selection) opció NE legyen bejelölve.
Next gombbal továbblépünk...

Az archetípusok közül válasszuk ezt: webapp-javaee6
Nekem nem volt benne a listában ez az archetípus. Ezért a Configure... gombon keresztül elérhető beállítópanelen felvettem Remote tárolóként ezt: http://repo.maven.apache.org/maven2
Ezután már elérhetővé vált. Próbáltam az alatta lévő webapp-javaee7 típust, de ott a letöltés sikertelen volt...
Next továbblépünk

Ezen a képernyőn a Package értéknek amit felajánl azt írjuk át a Group Id-ben található értékre.
Finish és készen is van.

Ezután a projektünk valahogy így néz ki:



A presentation modulban a hibákat javítsuk. 

A 10 és 12 sorokban látható groupId illetve verziószám nem kell, ezeket töröljük.
A 51-75 sorokban látható a maven-dependency-plugin. Ezt is töröljük ki.

Kész vagyunk, mentsük a konfigurációs fájlt.

A fájlrendszert ha megnézzük akkor látható hogy minden modulnak van pom.xml fájlja. Mindegyik pom.xml-ben szerepel a <parent> amiben a szülőprojektre hivatkozunk.

Most állítsuk be a függőségeket. Ezt az alkalmazás határozza meg igazából. A presentation függ a service-től, a service pedig a integration-től. Ehhez a modulok pom.xml-jébe fel kell venni a <dependencies> blokkba a következő szerint (ez a presentation modul pom-ja):

  1. <dependency>
  2.         <groupId>hu.bucsupe.test</groupId>
  3.         <artifactId>HelloEEWorld-service</artifactId>
  4.         <version>0.0.1-SNAPSHOT</version>
  5. </dependency>

A service modul pomjában a HelloEEWorld-integration modult kell megadni. Mivel ez a modul egy üres modul volt (nem volt archetipus) ezért itt még nincs semmiféle dependencia, úgyhogy a teljes függőségi deklarációt meg kell adni, azaz <dependencies> tagok közé kell illeszteni a függőséget.

  1. <dependencies>   
  2.     <dependency>
  3.         <groupId>hu.bucsupe.test</groupId>
  4.         <artifactId>HelloEEWorld-integration</artifactId>
  5.         <version>0.0.1-SNAPSHOT</version>
        
    </dependency>
  6. </dependencies>

Most hogy a függőségek is be vannak állítva próbáljuk ki hogy az összerakott multimodul projektünk jól be van-e állítva. Ehhez üres osztályokat fogunk felvenni, hogy lássuk a feloldások megtörténnek-e. Később ezeket az üres osztályokat (vagy helyettük másokat) kell implementálnunk és kész az Enterprise alkalmazásunk.

Az integration modulba hozzuk létre a TestDao osztályt.
Ez fogja az adatbázissal tartani a kapcsolatot. Adatokat szolgáltat a TestService felé.

A service modulban hozzuk létre a TestService osztályt.
Ez fogja megvalósítani az üzleti logikát és kiszolgálja a felhasználói interfészt

A presentation modulba hozzuk létre a a TestServlet nevű servletet. Figyelem itt nem osztályt hanem Servlet-et kell választani a menüben!
Ez a servlet fogja adni a felhasználói interfészt, ami a TestService-tól kapja az adatokat.


Miután készek a teszt osztályok, hivatkozzanak is ezek egymásra.

A TestServlet osztályba vegyünk fel privátként egy TestService tagot, illetve a TestService osztályba privátként egy TestDao tagot.

Ha valamilyen dependenciát felveszünk a szülő modulba (HelloEEWorld) akkor az mindhárom modulban elérhető lesz.


Ezzel elkészült az alkalmazás váza kész a projekt, össze van drótozva a integration rétegtől a presentation rétegig minden. Kezdődhet a fejlesztés! :)

Forrás:
Maven multi module project : javavids
StackOverflow: How do I configure a Java EE maven project in Eclipse?





2015. május 8., péntek

Mi is a Java Enterprise Edition

A Java Enterprise Edition (JavaEE) nem más, mint az üzleti alkalmazások fejlesztéséhez definiált programozói keretrendszer, mely API-kat definiál és ezekhez referencia implementációkat ad. A JavaEE a Java SE-re (Standard Edition) épülő fejlesztői keretrendszer. Talán úgy is lehet mondani hogy ilyen szempontból nincs különbség a JavaEE és a Java Collection Framework között.
A java.utils.Collection csomag tartalmazza pl a List interfész definícióját, melynek az egyik implementációja az ArrayList, melyet mindenkinek ismernie kell, aki írt már programot standard Java-ban.
 A JavaEE koncepció lényege, hogy egy úgynevezett alkalmazásszerver segítségével olyan környezetet biztosít, mely egy N rétegű alkalmazásarchitektúra kialakítását támogatja. Az alkalmazásszerver konténereket tartalmaz, melybe betölthetők az általunk készített Java osztályok. Ezeket az osztályokat az alkalmazásszerver menedzseli. Példányosít, szerializál, kommunikációs csatornát biztosít más objektumokkal, melyek más konténerekben, vagy akár másik JVM-ben is futhatnak. A konténerek tehát szolgáltatásokat nyújtanak, melyeket felhasználva tudjuk elkészíteni az üzleti N rétegű alkalmazásunkat, jól elkülönítve benne az üzleti logikát, az adatbázis kezelési funkcióktól, vagy a felhasználói interfésztől.
A JavaEE referencia implementációja a Glassfish alkalmazásszerver. Ez mellett találhatók a piacon további alkalmazásszerverek is melyek a különféle nagy cégek sajátjai (Weblogic, JBoss) illetve nyílt forráskódú szererek is (WildFly).
Az alkalmazásszerverek biztosítják a környezetet az osztályaink, objektumainknak. Ez a környezet a korábban már említett konténerekből áll. Az úgynevezett webkonténerben futnak a servletek, illetve az alkalmazás weboldalai itt tárolódnak. Az EJB konténerben pedig a JavaEE alkalmazás legfontosabb objektumai az Enterprise Java Bean-ek találhatók. A konténerek szolgáltatásokat nyújtanak a bennük létező objektumoknak, melyeket felhasználva "drótozhatjuk" össze az alkalmazásunkat.
A felhasználói felületek is többfélék lehetnek. Vastagkliens, webes vagy mondjuk Android vagy iOS kliensek jellemzően. A vastagkliensek az EJB-kkel kommunikálnak, a webes kliensek weboldalakon keresztül érik el a servleteket, az egyéb más kliensek pedig pl a szabványos  REST interfészen keresztül webservice-ket hívogatnak.

A jellemző architektúra tehát az hogy valamilyen kliens direktbe, vagy webservice-on keresztül szólítgatja az EJB konténerben csücsülő bean-eket. Ezek a bean-ek általában kapcsolatban vannak egy adatbázissal (Oracle, MySQL, Postgress stb), ahol az adatok tárolása történik.